在RedMonk發(fā)布的2015年1月編程語言排行榜中,Swift采納率排名迅速飆升,從剛剛面世時的68位躍至22位,Objective-C仍然穩(wěn)居TOP10,而JavaScript則憑借著其在iOS平臺上原生體驗優(yōu)勢成為了年度最火熱的編程語言。

而早在2013年蘋果發(fā)布的OS X Mavericks和iOS 7兩大系統(tǒng)中便均已加入了JavaScriptCore框架,能夠讓開發(fā)者輕松、快捷、安全地使用JavaScript語言編寫應用。不論叫好叫罵,JavaScript霸主地位已成事實。開發(fā)者們趨之若鶩,JS工具資源層出不窮,用于OSX和iOS系統(tǒng)等高速虛擬機也蓬勃發(fā)展起來。
JSContext/JSValue
JSContext即JavaScript代碼的運行環(huán)境。一個Context就是一個JavaScript代碼執(zhí)行的環(huán)境,也叫作用域。當在瀏覽器中運行JavaScript代碼時,JSContext就相當于一個窗口,能輕松執(zhí)行創(chuàng)建變量、運算乃至定義函數(shù)等的JavaScript代碼:
//Objective-C
JSContext *context = [[JSContext alloc] init];
[context evaluateScript:@"var num = 5 + 5"];
[context evaluateScript:@"var names = ['Grace', 'Ada', 'Margaret']"];
[context evaluateScript:@"var triple = function(value) { return value * 3 }"];
JSValue *tripleNum = [context evaluateScript:@"triple(num)"];
//Swift
let context = JSContext()
context.evaluateScript("var num = 5 + 5")
context.evaluateScript("var names = ['Grace', 'Ada', 'Margaret']")
context.evaluateScript("var triple = function(value) { return value * 3 }")
let tripleNum: JSValue = context.evaluateScript("triple(num)")
像JavaScript這類動態(tài)語言需要一個動態(tài)類型(Dynamic Type), 所以正如代碼最后一行所示,JSContext里不同的值均封裝在JSValue對象中,包括字符串、數(shù)值、數(shù)組、函數(shù)等,甚至還有Error以及null和undefined。
JSValue包含了一系列用于獲取Underlying Value的方法,如下表所示:

想要檢索上述示例中的tripleNum值,只需使用相應的方法即可:
//Objective-C
NSLog(@"Tripled: %d", [tripleNum toInt32]);
// Tripled: 30
//Swift
println("Tripled: (tripleNum.toInt32())")
// Tripled: 30
下標值 (Subscripting Values)
通過在JSContext和JSValue實例中使用下標符號可以輕松獲取上下文環(huán)境中已存在的值。其中,JSContext放入對象和數(shù)組的只能是字符串下標,而JSValue則可以是字符串或整數(shù)下標。
//Objective-C
JSValue *names = context[@"names"];
JSValue *initialName = names[0];
NSLog(@"The first name: %@", [initialName toString]);
// The first name: Grace
//Swift
let names = context.objectForKeyedSubscript("names")
let initialName = names.objectAtIndexedSubscript(0)
println("The first name: (initialName.toString())")
新聞熱點
疑難解答