JSValue(Objective-C)官方文档翻译

2016-06-04  本文已影响2013人  ShannonChenCHN

继承自:NSObject
遵守协议:NSObject

一、概述(Overview)

一个 JSValue 实例是一个 JavaScript 值的引用。你可以使用 JSValue 类在 JavaScript 和 Objective-C 或者 Swift 之间进行一些基本数值(比如数字和字符串)转换,这样你就可以在原生代码和 JavaScript 代码之间传递数据了。你也可以利用这个类去创建包装自定义类的 原生对象的JavaScript 对象,或者由原生方法或 block 提供实现的 JavaScript 函数。

每一个 JSValue 实例都来源于代表 JavaScript 执行环境(execution environment)的 JSContext 对象,而那个执行环境(execution environment)就包含了那个 JSValue 值。这个 JSValue 值对它的 context 对象进行了强引用——任何与一个特定 JSContext 实例有关联的值(JSValue)只要被 retain 了,那个 context 就会存活。当你调用了一个 JSValue 对象的实例方法,并且那个方法返回了另一个 JSValue 对象,这个被返回的 JSValue 归属于同一个的 context。

每个 JavaScript value 都跟一个特定的代表执行资源的 JSVirtualMachine 对象有关联。你只能传 JSValue 实例给由相同的虚拟机所管理(host)的 JSValue 和 JSContext 实例方法——如果传了一个值(JSvalue)给一个不同的虚拟机,系统将会抛出一个 Objective-C 异常。

2. JavaScript 和原生之间的数据转换(Converting Between JavaScript and Native Types)

当在使用 Creating JavaScript ValuesReading and Converting JavaScript Values 中所列出的方法时,JavaScriptCore 会按照下面的规则,自动将原生的值(value)转成 JavaScript 的值(value)或者将 JavaScript 的值(value)转成原生的值(value)。

当你转换一个对象、方法或者 block 时,JavaScriptCore 将会按照 表 1 中的规则去转换对象属性和方法参数的类型和值。

表 1 Objective-C 或者 Swift 与 JavaScript 之间的类型转换

Objective-C(和Swift)的数据类型 JavaScript 的数据类型 说明
nil undefined
NSNull null
NSString (Swift String) String
NSNumber 和 基本数据类型 Number, Boolean 转换是跟下面的这些方法一致的:① signed integer 类型:valueWithInt32:inContext: / toInt32 ;② unsigned integer 类型: valueWithUInt32:inContext: / toUInt32 ;③ Boolean 类型:valueWithBool:inContext: / toBool;④ 所有其他的数据类型: valueWithDouble:inContext: / toBool
NSDictionary (Swift Dictionary) Object 递归转换(Recursive conversion)
NSArray (Swift Array) Array 递归转换(Recursive conversion)
NSDate Date
Objective-C or Swift object (id orAnyObject);Objective-C or Swift class (Class orAnyClass) Object 使用 valueWithObject:inContext: / toObject 方法转换
Structure types: NSRange, CGRect, CGPoint, CGSize Object 不支持其他结构体类型的转换
Objective-C block (Swift closure) Function Convert explicitly with valueWithObject:inContext: / toObject. JavaScript functions do not convert to native blocks/closures unless already backed by a native block/closure.

二、功能(Tasks)

1.创建 JSValue 对象(Creating JavaScript Values)

+ valueWithObject:inContext:

+ valueWithBool:inContext:

+ valueWithDouble:inContext:

+ valueWithInt32:inContext:

+ valueWithUInt32:inContext:

+ valueWithNewObjectInContext:

+ valueWithNewArrayInContext:

+ valueWithNewRegularExpressionFromPattern:flags:inContext:

+ valueWithNewErrorFromMessage:inContext:

+ valueWithUndefinedInContext:

+ valueWithNullInContext:

+ valueWithPoint:inContext:

+ valueWithRange:inContext:

+ valueWithRect:inContext:

+ valueWithSize:inContext:

2.读取、转换 JSValue 对象(Reading and Converting JavaScript Values)

- toObject

- toObjectOfClass:

- toBool

- toDouble

- toInt32

- toUInt32

- toNumber

- toString

- toDate

- toArray

- toDictionary

- toPoint

- toRange

- toRect

- toSize

3.判断 JSValue 对象的类型(Determining the Type of a JavaScript Value)

isUndefined* Property*

isNull* Property*

isBoolean* Property*

isNumber* Property*

isString* Property*

isObject* Property*

isArray* Property*

isDate* Property*

4.比较 JSValue 对象(Comparing JavaScript Values)

- isEqualToObject:

- isEqualWithTypeCoercionToObject:

- isInstanceOf:

5.函数和构造函数(Working with Function and Constructor Values)

- callWithArguments:

- constructWithArguments:

- invokeMethod:withArguments:

6.容器(Working with Container Values)

- defineProperty:descriptor:

- hasProperty:

- deleteProperty:

- valueAtIndex:

- setValue:atIndex:

- valueForProperty:

- setValue:forProperty:

7.获取一个 JSValue 的上下文(Accessing a Value’s JavaScript Context)

context Property

8.通过下标获取 JSValue(Accessing Values with Subscript Syntax)

- objectAtIndexedSubscript:

- setObject:atIndexedSubscript:

- objectForKeyedSubscript:

- setObject:forKeyedSubscript:

9. JavaScriptCore 的 C 语言 API(Working with the C JavaScriptCore API)

JSValueRef Property

+ valueWithJSValueRef:inContext:

三、常量(Constants)

Property Descriptor Keys

Keys for the native dictionary representation of a JavaScript property descriptor, used with the defineProperty:descriptor: method.

Declaration

extern NSString * const JSPropertyDescriptorWritableKey;
extern NSString * const JSPropertyDescriptorEnumerableKey;
extern NSString * const JSPropertyDescriptorConfigurableKey;
extern NSString * const JSPropertyDescriptorValueKey;
extern NSString * const JSPropertyDescriptorGetKey;
extern NSString * const JSPropertyDescriptorSetKey;

Constants

Available in iOS 7.0 and later.

四、文档修订记录(Document Revision History)

下表所列为文档 JSValue Class Reference 的修订记录。

日期 说明
2015-12-08 新文档,用来描述一个 JavaScript 的虚拟机中的对象控件的一个值。

参考(Reference)
https://developer.apple.com/library/ios/documentation/JavaScriptCore/Reference/JSValue_Ref/index.html#//apple_ref/doc/constant_group/Property_Descriptor_Keys


问题(Question)

  1. JSValue 可以用来做什么?
  2. 如何使用 JSValue 来进行原生数据和 JavaScript 数据之间的转换?
  3. JSValue 和 JSContext 、JSManagedValue 以及 JSVirtualMachine 之间的关系?
上一篇下一篇

猜你喜欢

热点阅读