我一直在为iOS开发JavaScriptCore,我一直在尝试找到一种方法来做一些类似于v8中的"SetIndexedPropertiesToExternalArrayData“的事情,在v8中,我有一个javascript对象,并将它的数组数据设置为指向另一个对象的数组。例如,如果我有一个空的javascript对象,而另一个javascript对象看起来像:
{ '0': 0, '1': 1, '2': 2 };如果我让空的javascript对象指向数组对象,每当我调用曾经是空的array []运算符时,它将与其他javascript的数组值相同。
我一直在尝试尝试不同的东西,但我还没有找到这样做的方法。我的最终目标是在iOS中创建类型化数组,但是如果我没有弄错的话,外部数组和类型化数组在JavaScriptCore的iOS构建中是不存在的?
在此之前非常感谢。
发布于 2014-02-07 14:26:01
下面的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;
}正如您从示例代码中看到的,JavaScriptCore框架提供了NSDictionary对象和JavaScriptCore数组之间的内置转换。查看JSValue.h,它将这个内置转换描述为: NSDictionary转换为JavaScript“对象”,但是数组运算符可以很好地处理从Objective-C注入的值,并且为新的Javascript键控数组返回的对象是Objective-C中的有效NSDictionary对象
这解决了你的问题吗?还是我误解了?
发布于 2014-05-01 21:32:10
iOS 7附带的JavaScriptCore构建确实具有类型化数组,但不幸的是,公共API没有公开它们,因此您不能从本机访问它们的数据。但是,在类型化数组there's this iOS-specific fork of JavaScriptCore周围公开了一个公共包装。
https://stackoverflow.com/questions/21616641
复制相似问题