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

继承自: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)。

  • NSDictionary 对象或者 Swift 字典和它们所包含的 key 被转成带有对应名字的属性的 JavaScript 对象,反之亦然。字典中的值是被深拷贝和转换的。

  • NSArray 对象或者 Swift 数组会被转成 JavaScript 数组,反之亦然。字典中的值是被深拷贝和转换的。

  • Objective-C 的 block(或者带有 @convention(block) 的 Swift 闭包)会被转成 JavaScript 中的 Function 对象,参数和返回值也会按照转换规则被转换。

  • 对于所有其他的原生的对象类型,JavaScriptCore 会创建一个 JavaScript 包装器对象,这个包装器对象拥有与原生类继承链对应的构造器原型链。默认情况下,包装原生对象的 JavaScript 并不能让原生对象的属性和方法在 JavaScript 也能使用。如果要选择转成 JavaScript 的属性和方法,可以参阅 JSExport Protocol Reference

当你转换一个对象、方法或者 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

  • JSPropertyDescriptorWritableKey

    The Boolean value for this key determines whether the property permits assignment with the JavaScript = operator.

    Available in iOS 7.0 and later.

  • JSPropertyDescriptorEnumerableKey

    The Boolean value for this key determines whether the property appears when enumerating the JavaScript object’s properties.

    Available in iOS 7.0 and later.

  • JSPropertyDescriptorConfigurableKey

    The Boolean value for this key determines whether the property deleted from its JavaScript object or its descriptor changed.

    Available in iOS 7.0 and later.

  • JSPropertyDescriptorValueKey

    The value for the property on the JavaScript object.

    Available in iOS 7.0 and later.

  • JSPropertyDescriptorGetKey

    The JavaScript function to be invoked when reading the property.

    Available in iOS 7.0 and later.

  • JSPropertyDescriptorSetKey

    The JavaScript function to be invoked when writing to the property.

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 之间的关系?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容