Google 的 V8 引擎 是用 C++ 编写的,它也能够编译并执行 JavaScript 源代码、处理内存分配和垃圾回收。它被设计成由两个编译器组成,可以把源码直接编译成机器码:
Full-codegen:输出未优化代码的快速编译器
Crankshaft: 输出执行效率高、优化过的代码的慢速编译器
如果 Crankshaft 确定需要优化的代码是由 Full-codegen 生成的未优化代码,它就会取代 Full-codegen,这个过程叫做“crankshafting”。
一旦编译过程中产生了机器代码,引擎就会向浏览器暴露所有的数据类型、操作符、对象、在 ECMA 标准中指定的函数、或任何运行时需要使用的东西,NativeScript 就是如此。
有哪些 JavaScript 引擎?
有一大堆令人眼花缭乱的 JavaScript 引擎可以用来解释、分析和执行你的客户端代码。每个浏览器版本发布时,它的 JavaScript 引擎都可能有所改变或优化以跟上 JavaScript 代码执行技术的状况的变化。
你还没被这些浏览器引擎的名字完全弄糊涂之前,请记住很多市场营销的元素被加入了这些引擎和以它们为基础的浏览器。这篇对 JavaScript 编译 十分有用的分析 中,作者讽刺地指出:“你所不知道的是,编译器大约有 37% 是由市场营销构成的,对编译器进行品牌重塑也是你能做的为数不多的事情之一,智慧的市场营销,故而有了一系列名字:SquirrelFish、Nitro、SFX……”。
在牢记营销对命名和重命名这些引擎的影响的同时,注意到几件在 JavaScript 引擎发展史上的重大事件是很有用的。我为你做了一个便于理解的图表:
Browser, Headless Browser, or Runtime
JavaScript Engine
Mozilla
Spidermonkey
Chrome
V8
Safari
JavaScriptCore
IE and Edge
Chakra
PhantomJS
JavaScriptCore
HTMLUnit
Rhino
TrifleJS
V8
Node.js
V8
Io.js*
V8
*JavaScriptCore 被改写为 SquirrelFish,升级版本为 QuirrelFish Extreme,也叫做 Nitro。然而,构成 Webkit 实现基础的 JavaScript 引擎就是 JavaScriptCore(比如 Safari)。
**iOS 开发者应该要知道移动设备的 Safari 使用 Nitro,但是 UIWebView 不包括 JIT 编译,所以体验会慢一些。然而开发人员可以在 iOS8 中使用包含 Nitro 的 WKWebView,使用体验 明显 变快。混合移动应用程序的开发人员应该能松口气了。
*最终 io.js 从 Node.js 分离开的原因之一就是为了支持 V8 版本的引擎。这仍然是一个挑战,正如 这里 讲述的。
我们为什么要关注?
JavaScript 引擎的代码解析和执行过程的目标就是在最短时间内编译出最优化的代码。
最重要的是,这些引擎的演进与我们对发展 web 和 移动平台的不断探究息息相关,让它们尽可能具有高性能,是相辅相成的。为了追踪这种演进,你可以看到各种各样的引擎在基准图中是如何表现的,就好像 arewefastyet.com 总结的。例如,比较 Chrome 在搭载 V8 引擎与 non-Crankshafted 引擎时的表现就很有趣。
任何一个 web 开发者都要意识到,我们努力编写、调试和维护的代码在不同浏览器中执行效果必然有所差异。为什么某段代码在一个浏览器上工作得很慢,但在另一个上却快得多?
同样地,移动开发者,尤其是使用 webview 显示页面内容的混合移动应用开发者,或者那些使用像 NativeScript 这种运行时环境的开发者,想知道是什么引擎在解释执行他们的 JavaScript 代码。移动 web 开发者应该注意到那些小小设备上的浏览器所具备的各种局限性和可能性。作为一个想持续发展的 web、移动或应用程序开发人员,时刻关注 JavaScript 引擎的变化会带给你超值回报。
总结:
js 中的基本数据类型 undefined null boolean number string
js 中的一种复杂数据类型 object 它是所有对象的基础类型
js 和其他语言一样拥有9种基本的控制语句
js 中的函数无需指定返回值,实际上未指定返回值的函数返回的是undefined
js 中的参数可以随意的传递 注意arguments[] 数组 它可以帮助你
js 中的函数是不能重载的,但是你可以模仿。
您可能感兴趣的文章: