以下 IOS 代码显示了一个示例,该示例在 iOS 的 JavaScriptCore 中将键控数组从一个对象分配给另一个对象,然后在复制后对目标对象使用数组运算符。
我还展示了在 IOS Objective-C 和 JavaScriptCore 之间传递这些对象作为从 Objective-C 设置的离散 Javascript 对象以及将对象作为参数传递给 Javascript 函数。
JSContext *javascriptContext = [[JSContext alloc] init];
javascriptContext[@"consoleLog"] = ^(NSString *message) {
NSLog(@"Javascript log: %@",message);
};
NSDictionary *myArray = [NSDictionary dictionaryWithObjectsAndKeys:@0, @"item0", @1, @"item1", @2, @"item2", nil];
NSLog(@"myArray = %@", myArray);
javascriptContext[@"obj1"] = myArray;
[javascriptContext evaluateScript:@"var myFunction = function(arrayArg) {
consoleLog(\"obj1['item2'] = \" + obj1['item2']);
consoleLog(\"arrayArg['item0'] = \" + arrayArg['item0']);
var obj2 = obj1;
consoleLog(\"obj2['item1'] = \" + obj2['item1']);
obj1 = { 'key0': 0, 'key1': 1, 'key2': 2 };
obj2 = obj1;
consoleLog(\"obj2['key0'] = \" + obj2['key0']);
return obj2;
};"];
JSValue *function = javascriptContext[@"myFunction"];
NSArray *argList = [NSArray arrayWithObjects:myArray, nil];
JSValue *result = [function callWithArguments:argList];
NSDictionary *javascriptArray = [result toObject];
NSLog(@"javascriptArray returned = %@", javascriptArray);
如果您要复制此代码,请删除包含 javascript 函数的字符串中嵌入的换行符(为了清楚起见,我添加了这些)。
此代码生成以下控制台日志:
2014-02-07 16:49:55.901 TestHarness[4674:70b] myArray = {
item0 = 0;
item1 = 1;
item2 = 2;
}
2014-02-07 16:49:55.903 TestHarness[4674:70b] Javascript log: obj1['item2'] = 2
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: arrayArg['item0'] = 0
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['item1'] = 1
2014-02-07 16:49:55.904 TestHarness[4674:70b] Javascript log: obj2['key0'] = 0
2014-02-07 16:49:55.905 TestHarness[4674:70b] javascriptArray returned = {
key0 = 0;
key1 = 1;
key2 = 2;
}
从示例代码中可以看出,IOS JavaScriptCore 框架提供了 NSDictionary 对象和 Javascript 数组之间的内置转换。查看 JSValue.h,它将这种内置转换描述为:NSDictionary 转换为 JavaScript“对象”,但数组运算符在从 Objective-C 注入的值上工作正常,并且返回的对象为新的Javascript 键控数组是 Objective-C 中有效的 NSDictionary 对象
这能解决您的问题还是我误解了?