以下IOS代碼顯示了一個示例,在iOS內部的JavaScriptCore中將一個對象的一個對象分配給另一個對象,然後在複製後使用目標對象上的數組運算符。 我也展示了在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對象這是否解決了您的問題或者我誤解了?
在將數組分配給JavaScript對象後,更改Objective-C外部數組中的一個元素的進一步實驗顯示,JavaScriptCore獲取數組內容的副本而不是指向外部數組(它看不到更改) 。我不認爲我的答案能解決你的問題。 – Mike
是的,雖然我很感謝幫助,但這不幸並沒有解決問題。對於JavaScriptCore而言,它確實是在將數組複製到objective-c中,試圖讓一個javascript對象的數組指向另一個似乎是不可能的。我仍然在想辦法做到這一點,但迄今爲止沒有運氣。 – iNightfaller
我還想指出,我只是試圖爲索引數組做這個。我有幾個包含其他對象的JavaScript類,比如「函數」和對象需要的其他數據,所以試圖只將索引部分指向另一個數組似乎相當困難。 – iNightfaller