JSValue init(bool:in:) 与 JSValueMakeBoolean()

JSValue init(bool:in:) vs JSValueMakeBoolean()

我正在研究 JavaScript 核心框架,发现了两种在 JavaScript 上下文中创建布尔值的不同方法:

import JavaScriptCore

let context = JSContext()

let trueVal = JSValue(bool: true, in: context)
JSValueIsBoolean(context?.jsGlobalContextRef, trueVal?.jsValueRef) // true

let otherTrueValue = JSValueMakeBoolean(context?.jsGlobalContextRef, true)
JSValueIsBoolean(context?.jsGlobalContextRef, otherTrueValue) // true

JSValue(bool:in:)JSValueMakeBoolean有什么区别?

JSValueRef 生成的 header 保留此评论:

 * Copyright (C) 2006 Apple Inc.  All rights reserved.

对于JSValue

 * Copyright (C) 2013 Apple Inc. All rights reserved.

似乎 JavaScriptCore 框架最初是为具有基于 C-function API 的旧 OS X(在 the reference page 中显示 10.5+)开发的。后来 iOS 有了基于现代 class 的 API。

(虽然,我从来没有在这么老的 OS X 中使用过 JavaScriptCore。)

我还没有深入探索 JavaScriptCore,所以我不确定在某些情况下是否仍然需要这种基于 C-function 的 API。

但通常,您无需接触 C-function API。例如,您可以使用 isBoolean 属性 而不是 C-function JSValueIsBoolean.

if let trueVal = JSValue(bool: true, in: context) {
    print(trueVal.isBoolean) //->true
}