在RedMonk發布的2015年1月編程語言排行榜中,Swift采納率排名迅速飆升,從剛剛面世時的68位躍至22位,Objective-C仍然穩居TOP10,而JavaScript則憑借著其在iOS平臺上原生體驗優勢成為了年度最火熱的編程語言。
而早在2013年蘋果發布的OS X Mavericks和iOS 7兩大系統中便均已加入了JavaScriptCore框架,能夠讓開發者輕松、快捷、安全地使用JavaScript語言編寫應用。不論叫好叫罵,JavaScript霸主地位已成事實。開發者們趨之若鶩,JS工具資源層出不窮,用于OSX和iOS系統等高速虛擬機也蓬勃發展起來。
JSContext/JSValue
JSContext即JavaScript代碼的運行環境。一個Context就是一個JavaScript代碼執行的環境,也叫作用域。當在瀏覽器中運行JavaScript代碼時,JSContext就相當于一個窗口,能輕松執行創建變量、運算乃至定義函數等的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這類動態語言需要一個動態類型(Dynamic Type), 所以正如代碼最后一行所示,JSContext里不同的值均封裝在JSValue對象中,包括字符串、數值、數組、函數等,甚至還有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實例中使用下標符號可以輕松獲取上下文環境中已存在的值。其中,JSContext放入對象和數組的只能是字符串下標,而JSValue則可以是字符串或整數下標。
//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())")
新聞熱點
疑難解答