JavaScriptCore外部数组

时间:2014-02-06 23:55:03

标签: javascriptcore

我一直在搞乱iOS的JavaScriptCore,我一直试图找到一种方法,从v8开始做一些“SetIndexedPropertiesToExternalArrayData”,我会有一个javascript对象,并设置它的数组数据指向另一个对象的数组。例如,如果我有一个空的javascript对象,另一个javascript对象看起来像:

{ '0': 0, '1': 1, '2': 2 };

如果我要将空的javascript对象指向数组对象,每当我调用[以前是空的] array []运算符时,它将与其他javascript的数组值相同。

我一直试图玩弄不同的东西,我还没有找到办法。我的最终目标是在iOS中创建类型化数组,但如果我没弄错的话,在JavaScript内核的iOS版本中不存在外部数组和类型化数组?

提前多多感谢。

2 个答案:

答案 0 :(得分:0)

以下IOS代码显示了在JavaScriptCore for iOS中将键控数组从一个对象分配到另一个对象的示例,然后在复制后使用目标对象上的数组运算符。 我还展示了在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对象

这会解决您的问题还是我误解了?

答案 1 :(得分:0)

iOS 7附带的JavaScriptCore的构建确实有类型化数组,但不幸的是,公共API没有公开它们,因此您无法从本机触摸它们的数据。但是,there's this iOS-specific fork of JavaScriptCore公开了一个围绕类型化数组API的公共包装。