http://nshipster.cn/javascriptcore/JavaScriptCoreNate Cook撰写、 April Peng翻译、 发布于2015年1月19日这个星期流行编程语言的最新排名结果是,Swift 迅速从第 68 位跃升到 22 位,而 Objective-C 仍然稳固的占据在第 10 位。但是,说到允许在 iOS 上运行的其他语言 上,这两个都被甩的很远:当前的冠军是 JavaScript。OS X Mavericks 和 iOS 7 引入了 JavaScriptCore 库,它把 WebKit 的 JavaScript 引擎用 Objective-C 封装,提供了简单,快速以及安全的方式接入世界上最流行的语言。不管你爱它还是恨它,JavaScript 的普遍存在使得程序员、工具以及融合到 OS X 和 iOS 里这样超快的虚拟机中资源的使用都大幅增长。这样一来,先抛开动态和类型安全的痛苦辩论,让我带你一起来做一个 JavaScriptCore 的观光。JSContext / JSValueJSContext 是运行 JavaScript 代码的环境。一个 JSContext 是一个全局环境的实例,如果你写过一个在浏览器内运行的 JavaScript,JSContext 类似于 window。创建一个 JSContext 后,可以很容易地运行 JavaScript 代码来创建变量,做计算,甚至定义方法:SwiftObjective-Clet 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)")代码的最后一行,任何出自 JSContext 的值都被包裹在一个 JSValue 对象中。像 JavaScript 这样的动态语言需要一个动态类型,所以 JSValue 包装了每一个可能的 JavaScript 值:字符串和数字;数组、对象和方法;甚至错误和特殊的 JavaScript 值诸如 null 和 undefined。JSValue 包括一系列方法用于访问其可能的值以保证有正确的 Foundation 类型,包括:JavaScript TypeJSValue methodObjective-C TypeSwift TypestringtoStringNSStringString!booleantoBoolBOOLBoolnumbertoNumbertoDoubletoInt32toUInt32NSNumberdoubleint32_tuint32_tNSNumber!DoubleInt32UInt32DatetoDateNSDateNSDate!ArraytoArrayNSArray[AnyObject]!ObjecttoDictionaryNSDictionary[NSObject : AnyObject]!ObjecttoObjecttoObjectOfClass:custom typecustom type从上面的例子中得到 tripleNum 的值,只需使用适当的方法:SwiftObjective-Cprintln("Tripled: (tripleNum.toInt32())") // Tripled: 30下标值对 JSContext 和 JSValue 实例使用下标的方式我们可以很容易地访问我们之前创建的 context 的任何值。JSContext 需要一个字符串下标,而 JSValue 允许使用字符串或整数标来得到里面的对象和数组:SwiftObjective-Clet names = context.objectForKeyedSubscript("names") let initialName = names.objectAtIndexedSubscript(0) println("The first name: (initialName.toString())") // The first name: GraceSwift 展示了它的青涩,在这里,Objective-C 代码可以利用下标表示法,Swift 目前只公开原始方法来让下标成为可能:objectAtKeyedSubscript() 和 objectAtIndexedSubscript()。