首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScriptCore外部数组

JavaScriptCore外部数组
EN

Stack Overflow用户
提问于 2014-02-07 07:55:03
回答 2查看 1.1K关注 0票数 2

我一直在为iOS开发JavaScriptCore,我一直在尝试找到一种方法来做一些类似于v8中的"SetIndexedPropertiesToExternalArrayData“的事情,在v8中,我有一个javascript对象,并将它的数组数据设置为指向另一个对象的数组。例如,如果我有一个空的javascript对象,而另一个javascript对象看起来像:

代码语言:javascript
运行
复制
{ '0': 0, '1': 1, '2': 2 };

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

我一直在尝试尝试不同的东西,但我还没有找到这样做的方法。我的最终目标是在iOS中创建类型化数组,但是如果我没有弄错的话,外部数组和类型化数组在JavaScriptCore的iOS构建中是不存在的?

在此之前非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2014-02-07 14:26:01

下面的IOS代码显示了一个示例,该示例在iOS的JavaScriptCore中将一个对象的键控数组分配给另一个对象,然后在复制后对目标对象使用数组操作符。我还展示了在IOS Objective-C和JavaScriptCore之间传递这些对象,既可以作为Objective-C设置的离散Javascript对象,也可以将该对象作为参数传递给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函数的字符串中嵌入的换行符(为了清楚起见,我添加了这些换行符)。

此代码生成以下控制台日志:

代码语言: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对象

这解决了你的问题吗?还是我误解了?

票数 0
EN

Stack Overflow用户

发布于 2014-05-01 21:32:10

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21616641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档