本教程全面介绍 JavaScript 核心语法,从最简单的开始讲起,循序渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便于理解和模仿,可以用到实际项目中,即学即用。
本教程适合初学者当作 JavaScript 语言的入门教程,也适合当作日常使用的参考手册。

注脚

展开查看详情

1. 目 录 致谢 介绍 前言 入门篇 导论 历史 基本语法 数据类型 概述 null,undefined 和布尔值 数值 字符串 对象 函数 数组 运算符 算术运算符 比较运算符 布尔运算符 二进制位运算符 其他运算符,运算顺序 语法专题 数据类型的转换 错误处理机制 编程风格 console 对象与控制台 标准库 Object 对象 属性描述对象 Array 对象 包装对象 Boolean 对象 本文档使用 书栈(BookStack.CN) 构建 - 1 -

2. Number 对象 String 对象 Math 对象 Date 对象 RegExp 对象 JSON 对象 面向对象编程 实例对象与 new 命令 this 关键字 对象的继承 Object 对象的相关方法 严格模式 异步操作 概述 定时器 Promise 对象 DOM 概述 本文档使用 书栈(BookStack.CN) 构建 - 2 -

3.致谢 致谢 当前文档 《阮一峰 JavaScript 教程》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构建,生成于 2018-02-26。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以 及对文档内容的生成和导出工具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认 文档内容知识点是否错漏。如果您在阅读文档获取知识的时候,发现文 档内容有不恰当的地方,请向我们反馈,让我们共同携手,将知识准 确、高效且有效地传递给每一个人。 同时,如果您在日常生活、工作和学习中遇到有价值有营养的知识 文档,欢迎分享到 书栈(BookStack.CN) ,为知识的传承献上您的 一份力量! 如果当前文档生成时间太久,请到 书栈(BookStack.CN) 获取 最新的文档,以跟上知识更新换代的步伐。 文档地 址:http://www.bookstack.cn/books/javascript- tutorial 书栈官网:http://www.bookstack.cn 书栈开源:https://github.com/TruthHun 分享,让知识传承更久远! 感谢知识的创造者,感谢知识的分享 者,也感谢每一位阅读到此处的读者,因为我们都将成为知识的传承 者。 本文档使用 书栈(BookStack.CN) 构建 - 3 -

4.致谢 本文档使用 书栈(BookStack.CN) 构建 - 4 -

5.介绍 介绍 本教程全面介绍 JavaScript 核心语法,从最简单的开始讲起,循序 渐进、由浅入深,力求清晰易懂。所有章节都带有大量的代码实例,便 于理解和模仿,可以用到实际项目中,即学即用。 本教程适合初学者当作 JavaScript 语言的入门教程,也适合当作日 常使用的参考手册。 本文档使用 书栈(BookStack.CN) 构建 - 5 -

6.前言 前言 前言 前言 我写这本教程,主要原因是自己需要。 编程时,往往需要查阅资料,确定准确用法。理想的 JavaScript 参 考书,应该简明易懂,一目了然,告诉我有哪些注意点,提供代码范 例。如果涉及重要概念,还应该适当讲解。可是大多数时候,现实都不 是如此。找到的资料冗长难懂,抓不住重点,有时还很陈旧,跟不上语 言标准和浏览器的快速发展,且大多数是英文资料。 学习过程中,我做了很多 JavaScript 笔记。多年累积,数量相当庞 大。遇到问题,我首先查自己的笔记,如果笔记里没有,再到网上查, 最后回过头把笔记补全。终于有一天,我意识到可以把笔记做成书,这 就是这本书的由来。 正因为脱胎于笔记,这本教程跟其他 JavaScript 书籍有所不同。作 为教程,本书对所有重要概念都进行了讲解,努力把复杂的问题讲得简 单,希望一两分钟内就能抓住重点。本书还可以作为参考手册,罗列了 主要用法和各种 API 接口,并给出可以立即运行的代码。所有章节按 照语言的 API 编排,方便以后的查阅。 如果你发现某处出现陌生的新概念,请不要担心,可以继续阅读下去。 以后查阅这些章节的时候,你会发现很方便找到某个知识点相关的所有 内容。 本文档使用 书栈(BookStack.CN) 构建 - 6 -

7.前言 本文档使用 书栈(BookStack.CN) 构建 - 7 -

8.入门篇 入门篇 入门篇 导论 历史 基本语法 本文档使用 书栈(BookStack.CN) 构建 - 8 -

9.导论 导论 导论 什么是 JavaScript 语言? 为什么学习 JavaScript? 操控浏览器的能力 广泛的使用领域 易学性 强大的性能 开放性 社区支持和就业机会 实验环境 导论 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script language),指的是它不具备开发操作系统的能力,而是只用来编写 控制其他大型应用程序(比如浏览器)的“脚本”。 JavaScript 也是一种嵌入式(embedded)语言。它本身提供的核 心语法不算很多,只能用来做一些数学和逻辑运算。JavaScript 本 身不提供任何与 I/O(输入/输出)相关的 API,都要靠宿主环境 (host)提供,所以 JavaScript 只合适嵌入更大型的应用程序环 境,去调用宿主环境提供的底层 API。 目前,已经嵌入 JavaScript 的宿主环境有多种,最常见的环境就是 浏览器,另外还有服务器环境,也就是 Node 项目。 本文档使用 书栈(BookStack.CN) 构建 - 9 -

10.导论 从语法角度看,JavaScript 语言是一种“对象模型”语言。各种宿主 环境通过这个模型,描述自己的功能和操作接口,从而通过 JavaScript 控制这些功能。但是,JavaScript 并不是纯粹的“面 向对象语言”,还支持其他编程范式(比如函数式编程)。这导致几乎 任何一个问题,JavaScript 都有多种解决方法。阅读本书的过程 中,你会诧异于 JavaScript 语法的灵活性。 JavaScript 的核心语法部分相当精简,只包括两个部分:基本的语 法构造(比如操作符、控制结构、语句)和标准库(就是一系列具有各 种功能的对象比如 Array 、 Date 、 Math 等)。除此之外,各种宿 主环境提供额外的 API(即只能在该环境使用的接口),以便 JavaScript 调用。以浏览器为例,它提供的额外 API 可以分成三 大类。 浏览器控制类:操作浏览器 DOM 类:操作网页的各种元素 Web 类:实现互联网的各种功能 如果宿主环境是服务器,则会提供各种操作系统的 API,比如文件操 作 API、网络通信 API等等。这些你都可以在 Node 环境中找到。 本书主要介绍 JavaScript 核心语法和浏览器网页开发的基本知识, 不涉及 Node。全书可以分成以下四大部分。 基本语法 标准库 浏览器 API DOM JavaScript 语言有多个版本。本书的内容主要基于 ECMAScript 5.1 版本,这是学习 JavaScript 语法的基础。ES6 和更新的语法 本文档使用 书栈(BookStack.CN) 构建 - 10 -

11.导论 请参考我写的《ECMAScript 6入门》。 为什么学习 JavaScript? JavaScript 语言有一些显著特点,使得它非常值得学习。它既适合 作为学习编程的入门语言,也适合当作日常开发的工作语言。它是目前 最有希望、前途最光明的计算机语言之一。 操控浏览器的能力 JavaScript 的发明目的,就是作为浏览器的内置脚本语言,为网页 开发者提供操控浏览器的能力。它是目前唯一一种通用的浏览器脚本语 言,所有浏览器都支持。它可以让网页呈现各种特殊效果,为用户提供 良好的互动体验。 目前,全世界几乎所有网页都使用 JavaScript。如果不用,网站的 易用性和使用效率将大打折扣,无法成为操作便利、对用户友好的网 站。 对于一个互联网开发者来说,如果你想提供漂亮的网页、令用户满意的 上网体验、各种基于浏览器的便捷功能、前后端之间紧密高效的联系, JavaScript 是必不可少的工具。 广泛的使用领域 近年来,JavaScript 的使用范围,慢慢超越了浏览器,正在向通用 的系统语言发展。 (1)浏览器的平台化 随着 HTML5 的出现,浏览器本身的功能越来越强,不再仅仅能浏览网 页,而是越来越像一个平台,JavaScript 因此得以调用许多系统功 本文档使用 书栈(BookStack.CN) 构建 - 11 -

12.导论 能,比如操作本地文件、操作图片、调用摄像头和麦克风等等。这使得 JavaScript 可以完成许多以前无法想象的事情。 (2)Node Node 项目使得 JavaScript 可以用于开发服务器端的大型项目,网 站的前后端都用 JavaScript 开发已经成为了现实。有些嵌入式平台 (Raspberry Pi)能够安装 Node,于是 JavaScript 就能为这 些平台开发应用程序。 (3)数据库操作 JavaScript 甚至也可以用来操作数据库。NoSQL 数据库这个概念, 本身就是在 JSON(JavaScript Object Notation)格式的基础 上诞生的,大部分 NoSQL 数据库允许 JavaScript 直接操作。基 于 SQL 语言的开源数据库 PostgreSQL 支持 JavaScript 作为 操作语言,可以部分取代 SQL 查询语言。 (4)移动平台开发 JavaScript 也正在成为手机应用的开发语言。一般来说,安卓平台 使用 Java 语言开发,iOS 平台使用 Objective-C 或 Swift 语 言开发。许多人正在努力,让 JavaScript 成为各个平台的通用开发 语言。 PhoneGap 项目就是将 JavaScript 和 HTML5 打包在一个容器之 中,使得它能同时在 iOS 和安卓上运行。Facebook 公司的 React Native 项目则是将 JavaScript 写的组件,编译成原生组件,从 而使它们具备优秀的性能。 Mozilla 基金会的手机操作系统 Firefox OS,更是直接将 JavaScript 作为操作系统的平台语言,但是很可惜这个项目没有成 本文档使用 书栈(BookStack.CN) 构建 - 12 -

13.导论 功。 (5)内嵌脚本语言 越来越多的应用程序,将 JavaScript 作为内嵌的脚本语言,比如 Adobe 公司的著名 PDF 阅读器 Acrobat、Linux 桌面环境 GNOME 3。 (6)跨平台的桌面应用程序 Chromium OS、Windows 8 等操作系统直接支持 JavaScript 编 写应用程序。Mozilla 的 Open Web Apps 项目、Google 的 Chrome App 项目、Github 的 Electron 项目、以及 TideSDK 项目,都可以用来编写运行于 Windows、Mac OS 和 Android 等 多个桌面平台的程序,不依赖浏览器。 (7)小结 可以预期,JavaScript 最终将能让你只用一种语言,就开发出适应 不同平台(包括桌面端、服务器端、手机端)的程序。早在2013年9月 的统计之中,JavaScript 就是当年 Github 上使用量排名第一的 语言。 著名程序员 Jeff Atwood 甚至提出了一条 “Atwood 定律”: “所有可以用 JavaScript 编写的程序,最终都会出现 JavaScript 的版本。”(Any application that can be written in JavaScript will eventually be written in JavaScript.) 易学性 相比学习其他语言,学习 JavaScript 有一些有利条件。 (1)学习环境无处不在 本文档使用 书栈(BookStack.CN) 构建 - 13 -

14.导论 只要有浏览器,就能运行 JavaScript 程序;只要有文本编辑器,就 能编写 JavaScript 程序。这意味着,几乎所有电脑都原生提供 JavaScript 学习环境,不用另行安装复杂的 IDE(集成开发环境) 和编译器。 (2)简单性 相比其他脚本语言(比如 Python 或 Ruby),JavaScript 的语 法相对简单一些,本身的语法特性并不是特别多。而且,那些语法中的 复杂部分,也不是必需要学会。你完全可以只用简单命令,完成大部分 的操作。 (3)与主流语言的相似性 JavaScript 的语法很类似 C/C++ 和 Java,如果学过这些语言 (事实上大多数学校都教),JavaScript 的入门会非常容易。 必须说明的是,虽然核心语法不难,但是 JavaScript 的复杂性体现 在另外两个方面。 首先,它涉及大量的外部 API。JavaScript 要发挥作用,必须与其 他组件配合,这些外部组件五花八门,数量极其庞大,几乎涉及网络应 用的各个方面,掌握它们绝非易事。 其次,JavaScript 语言有一些设计缺陷。某些地方相当不合理,另 一些地方则会出现怪异的运行结果。学习 JavaScript,很大一部分 时间是用来搞清楚哪些地方有陷阱。Douglas Crockford 写过一本 有名的书,名字就叫《JavaScript: The Good Parts》,言下之 意就是这门语言不好的地方很多,必须写一本书才能讲清楚。另外一些 程序员则感到,为了更合理地编写 JavaScript 程序,就不能用 JavaScript 来写,而必须发明新的语言,比如 CoffeeScript、 TypeScript、Dart 这些新语言的发明目的,多多少少都有这个因 本文档使用 书栈(BookStack.CN) 构建 - 14 -

15.导论 素。 尽管如此,目前看来,JavaScript 的地位还是无法动摇。加之,语 言标准的快速进化,使得 JavaScript 功能日益增强,而语法缺陷和 怪异之处得到了弥补。所以,JavaScript 还是值得学习,况且它的 入门真的不难。 强大的性能 JavaScript 的性能优势体现在以下方面。 (1)灵活的语法,表达力强。 JavaScript 既支持类似 C 语言清晰的过程式编程,也支持灵活的 函数式编程,可以用来写并发处理(concurrent)。这些语法特性已 经被证明非常强大,可以用于许多场合,尤其适用异步编程。 JavaScript 的所有值都是对象,这为程序员提供了灵活性和便利 性。因为你可以很方便地、按照需要随时创造数据结构,不用进行麻烦 的预定义。 JavaScript 的标准还在快速进化中,并不断合理化,添加更适用的 语法特性。 (2)支持编译运行。 JavaScript 语言本身,虽然是一种解释型语言,但是在现代浏览器 中,JavaScript 都是编译后运行。程序会被高度优化,运行效率接 近二进制程序。而且,JavaScript 引擎正在快速发展,性能将越来 越好。 此外,还有一种 WebAssembly 格式,它是 JavaScript 引擎的中 间码格式,全部都是二进制代码。由于跳过了编译步骤,可以达到接近 本文档使用 书栈(BookStack.CN) 构建 - 15 -

16.导论 原生二进制代码的运行速度。各种语言(主要是 C 和 C++)通过编译 成 WebAssembly,就可以在浏览器里面运行。 (3)事件驱动和非阻塞式设计。 JavaScript 程序可以采用事件驱动(event-driven)和非阻塞式 (non-blocking)设计,在服务器端适合高并发环境,普通的硬件就 可以承受很大的访问量。 开放性 JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国 际标准,写得非常详尽明确;该标准的主要实现(比如 V8 和 SpiderMonkey 引擎)都是开放的,而且质量很高。这保证了这门语 言不属于任何公司或个人,不存在版权和专利的问题。 语言标准由 TC39 委员会负责制定,该委员会的运作是透明的,所有 讨论都是开放的,会议记录都会对外公布。 不同公司的 JavaScript 运行环境,兼容性很好,程序不做调整或只 做很小的调整,就能在所有浏览器上运行。 社区支持和就业机会 全世界程序员都在使用 JavaScript,它有着极大的社区、广泛的文 献和图书、丰富的代码资源。绝大部分你需要用到的功能,都有多个开 源函数库可供选用。 作为项目负责人,你不难招聘到数量众多的 JavaScript 程序员;作 为开发者,你也不难找到一份 JavaScript 的工作。 实验环境 本文档使用 书栈(BookStack.CN) 构建 - 16 -

17.导论 本教程包含大量的示例代码,只要电脑安装了浏览器,就可以用来实验 了。读者可以一边读一边运行示例,加深理解。 推荐安装 Chrome 浏览器,它的“开发者工具”(Developer Tools)里面的“控制台”(console),就是运行 JavaScript 代 码的理想环境。 进入 Chrome 浏览器的“控制台”,有两种方法。 直接进入:按下 Option + Command + J (Mac)或者 Ctrl + Shift + J (Windows / Linux) 开发者工具进入:开发者工具的快捷键是 F12,或者 Option + Command + I (Mac)以及 Ctrl + Shift + I (Windows / Linux),然后选择 Console 面板 进入控制台以后,就可以在提示符后输入代码,然后按 Enter 键,代 码就会执行。如果按 Shift + Enter 键,就是代码换行,不会触发执 行。建议阅读本教程时,将代码复制到控制台进行实验。 作为尝试,你可以将下面的程序复制到“控制台”,按下回车后,就可以 看到运行结果。 1. function greetMe(yourName) { 2. console.log('Hello ' + yourName); 3. } 4. 5. greetMe('World') 6. // Hello World 本文档使用 书栈(BookStack.CN) 构建 - 17 -

18.历史 历史 JavaScript 语言的历史 诞生 JavaScript 与 Java 的关系 JavaScript 与 ECMAScript 的关系 JavaScript的版本 周边大事记 参考链接 JavaScript 语言的历史 诞生 JavaScript 因为互联网而生,紧跟着浏览器的出现而问世。回顾它 的历史,就要从浏览器的历史讲起。 1990年底,欧洲核能研究组织(CERN)科学家 Tim Berners- Lee,在全世界最大的电脑网络——互联网的基础上,发明了万维网 (World Wide Web),从此可以在网上浏览网页文件。最早的网页 只能在操作系统的终端里浏览,也就是说只能使用命令行操作,网页都 是在字符窗口中显示,这当然非常不方便。 1992年底,美国国家超级电脑应用中心(NCSA)开始开发一个独立的 浏览器,叫做 Mosaic。这是人类历史上第一个浏览器,从此网页可以 在图形界面的窗口浏览。 1994年10月,NCSA 的一个主要程序员 Marc Andreessen 联合风 险投资家 Jim Clark,成立了 Mosaic 通信公司(Mosaic Communications),不久后改名为 Netscape。这家公司的方向, 本文档使用 书栈(BookStack.CN) 构建 - 18 -

19.历史 就是在 Mosaic 的基础上,开发面向普通用户的新一代的浏览器 Netscape Navigator。 1994年12月,Navigator 发布了1.0版,市场份额一举超过90%。 Netscape 公司很快发现,Navigator 浏览器需要一种可以嵌入网 页的脚本语言,用来控制浏览器行为。当时,网速很慢而且上网费很 贵,有些操作不宜在服务器端完成。比如,如果用户忘记填写“用户 名”,就点了“发送”按钮,到服务器再发现这一点就有点太晚了,最好 能在用户发出数据之前,就告诉用户“请填写用户名”。这就需要在网页 中嵌入小程序,让浏览器检查每一栏是否都填写了。 管理层对这种浏览器脚本语言的设想是:功能不需要太强,语法较为简 单,容易学习和部署。那一年,正逢 Sun 公司的 Java 语言问世, 市场推广活动非常成功。Netscape 公司决定与 Sun 公司合作,浏 览器支持嵌入 Java 小程序(后来称为 Java applet)。但是,浏 览器脚本语言是否就选用 Java,则存在争论。后来,还是决定不使用 Java,因为网页小程序不需要 Java 这么“重”的语法。但是,同时也 决定脚本语言的语法要接近 Java,并且可以支持 Java 程序。这些 设想直接排除了使用现存语言,比如 Perl、Python 和 TCL。 1995年,Netscape 公司雇佣了程序员 Brendan Eich 开发这种网 页脚本语言。Brendan Eich 有很强的函数式编程背景,希望以 Scheme 语言(函数式语言鼻祖 LISP 语言的一种方言)为蓝本,实 现这种新语言。 1995年5月,Brendan Eich 只用了10天,就设计完成了这种语言的 第一版。它是一个大杂烩,语法有多个来源。 基本语法:借鉴 C 语言和 Java 语言。 数据结构:借鉴 Java 语言,包括将值分成原始值和对象两大 本文档使用 书栈(BookStack.CN) 构建 - 19 -

20.历史 类。 函数的用法:借鉴 Scheme 语言和 Awk 语言,将函数当作第一 等公民,并引入闭包。 原型继承模型:借鉴 Self 语言(Smalltalk 的一种变种)。 正则表达式:借鉴 Perl 语言。 字符串和数组处理:借鉴 Python 语言。 为了保持简单,这种脚本语言缺少一些关键的功能,比如块级作用域、 模块、子类型(subtyping)等等,但是可以利用现有功能找出解决 办法。这种功能的不足,直接导致了后来 JavaScript 的一个显著特 点:对于其他语言,你需要学习语言的各种功能,而对于 JavaScript,你常常需要学习各种解决问题的模式。而且由于来源多 样,从一开始就注定,JavaScript 的编程风格是函数式编程和面向 对象编程的一种混合体。 Netscape 公司的这种浏览器脚本语言,最初名字叫做 Mocha, 1995年9月改为 LiveScript。12月,Netscape 公司与 Sun 公司 (Java 语言的发明者和所有者)达成协议,后者允许将这种语言叫做 JavaScript。这样一来,Netscape 公司可以借助 Java 语言的声 势,而 Sun 公司则将自己的影响力扩展到了浏览器。 之所以起这个名字,并不是因为 JavaScript 本身与 Java 语言有 多么深的关系(事实上,两者关系并不深,详见下节),而是因为 Netscape 公司已经决定,使用 Java 语言开发网络应用程序, JavaScript 可以像胶水一样,将各个部分连接起来。当然,后来的 历史是 Java 语言的浏览器插件失败了,JavaScript 反而发扬光 大。 1995年12月4日,Netscape 公司与 Sun 公司联合发布了 JavaScript 语言,对外宣传 JavaScript 是 Java 的补充,属 本文档使用 书栈(BookStack.CN) 构建 - 20 -

21.历史 于轻量级的 Java,专门用来操作网页。 1996年3月,Navigator 2.0 浏览器正式内置了 JavaScript 脚 本语言。 JavaScript 与 Java 的关系 这里专门说一下 JavaScript 和 Java 的关系。它们是两种不一样 的语言,但是彼此存在联系。 JavaScript 的基本语法和对象体系,是模仿 Java 而设计的。但 是,JavaScript 没有采用 Java 的静态类型。正是因为 JavaScript 与 Java 有很大的相似性,所以这门语言才从一开始的 LiveScript 改名为 JavaScript。基本上,JavaScript 这个名 字的原意是“很像Java的脚本语言”。 JavaScript 语言的函数是一种独立的数据类型,以及采用基于原型 对象(prototype)的继承链。这是它与 Java 语法最大的两点区 别。JavaScript 语法要比 Java 自由得多。 另外,Java 语言需要编译,而 JavaScript 语言则是运行时由解释 器直接执行。 总之,JavaScript 的原始设计目标是一种小型的、简单的动态语 言,与 Java 有足够的相似性,使得使用者(尤其是 Java 程序员) 可以快速上手。 JavaScript 与 ECMAScript 的关系 1996年8月,微软模仿 JavaScript 开发了一种相近的语言,取名为 JScript(JavaScript是Netscape的注册商标,微软不能用),首 先内置于IE 3.0。Netscape 公司面临丧失浏览器脚本语言的主导权 本文档使用 书栈(BookStack.CN) 构建 - 21 -

22.历史 的局面。 1996年11月,Netscape 公司决定将 JavaScript 提交给国际标准 化组织 ECMA(European Computer Manufacturers Association),希望 JavaScript 能够成为国际标准,以此抵抗 微软。ECMA 的39号技术委员会(Technical Committee 39)负 责制定和审核这个标准,成员由业内的大公司派出的工程师组成,目前 共25个人。该委员会定期开会,所有的邮件讨论和会议记录,都是公开 的。 1997年7月,ECMA 组织发布262号标准文件(ECMA-262)的第一 版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript。这个版本就是 ECMAScript 1.0 版。之所以不叫 JavaScript,一方面是由于商标的关系,Java 是 Sun 公司的商 标,根据一份授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 已经被 Netscape 公司 注册为商标,另一方面也是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。因此, ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者 是前者的一种实现。在日常场合,这两个词是可以互换的。 ECMAScript 只用来标准化 JavaScript 这种语言的基本语法结 构,与部署环境相关的标准都由其他标准规定,比如 DOM 的标准就是 由 W3C组织(World Wide Web Consortium)制定的。 ECMA-262 标准后来也被另一个国际标准化组织 ISO(International Organization for Standardization)批准,标准号是 ISO-16262。 JavaScript的版本 本文档使用 书栈(BookStack.CN) 构建 - 22 -

23.历史 1997年7月,ECMAScript 1.0发布。 1998年6月,ECMAScript 2.0版发布。 1999年12月,ECMAScript 3.0版发布,成为 JavaScript 的通行 标准,得到了广泛支持。 2007年10月,ECMAScript 4.0版草案发布,对3.0版做了大幅升 级,预计次年8月发布正式版本。草案发布后,由于4.0版的目标过于 激进,各方对于是否通过这个标准,发生了严重分歧。以 Yahoo、 Microsoft、Google 为首的大公司,反对 JavaScript 的大幅升 级,主张小幅改动;以 JavaScript 创造者 Brendan Eich 为首 的 Mozilla 公司,则坚持当前的草案。 2008年7月,由于对于下一个版本应该包括哪些功能,各方分歧太大, 争论过于激进,ECMA 开会决定,中止 ECMAScript 4.0 的开发 (即废除了这个版本),将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版 本,由于会议的气氛,该版本的项目代号起名为 Harmony(和谐)。 会后不久,ECMAScript 3.1 就改名为 ECMAScript 5。 2009年12月,ECMAScript 5.0版 正式发布。Harmony 项目则一 分为二,一些较为可行的设想定名为 JavaScript.next 继续开发, 后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为 JavaScript.next.next,在更远的将来再考虑推出。TC39 的总体 考虑是,ECMAScript 5 与 ECMAScript 3 基本保持兼容,较大的 语法修正和新功能加入,将由 JavaScript.next 完成。当时, JavaScript.next 指的是ECMAScript 6。第六版发布以后,将指 ECMAScript 7。TC39 预计,ECMAScript 5 会在2013年的年中 成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位 置。 本文档使用 书栈(BookStack.CN) 构建 - 23 -

24.历史 2011年6月,ECMAscript 5.1版发布,并且成为 ISO 国际标准 (ISO/IEC 16262:2011)。到了2012年底,所有主要浏览器都支持 ECMAScript 5.1版的全部功能。 2013年3月,ECMAScript 6 草案冻结,不再添加新功能。新的功能 设想将被放到 ECMAScript 7。 2013年12月,ECMAScript 6 草案发布。然后是12个月的讨论期, 听取各方反馈。 2015年6月,ECMAScript 6 正式发布,并且更名为“ECMAScript 2015”。这是因为 TC39 委员会计划,以后每年发布一个 ECMAScript 的版本,下一个版本在2016年发布,称 为”ECMAScript 2016”,2017年发布“ECMAScript 2017”,以此 类推。 周边大事记 JavaScript 伴随着互联网的发展一起发展。互联网周边技术的快速 发展,刺激和推动了 JavaScript 语言的发展。下面,回顾一下 JavaScript 的周边应用发展。 1996年,样式表标准 CSS 第一版发布。 1997年,DHTML(Dynamic HTML,动态 HTML)发布,允许动态改 变网页内容。这标志着 DOM 模式(Document Object Model,文 档对象模型)正式应用。 1998年,Netscape 公司开源了浏览器,这导致了 Mozilla 项目的 诞生。几个月后,美国在线(AOL)宣布并购 Netscape。 1999年,IE 5部署了 XMLHttpRequest 接口,允许 JavaScript 本文档使用 书栈(BookStack.CN) 构建 - 24 -

25.历史 发出 HTTP 请求,为后来大行其道的 Ajax 应用创造了条件。 2000年,KDE 项目重写了浏览器引擎 KHTML,为后来的 WebKit 和 Blink 引擎打下基础。这一年的10月23日,KDE 2.0发布,第一次将 KHTML 浏览器包括其中。 2001年,微软公司时隔5年之后,发布了 IE 浏览器的下一个版本 Internet Explorer 6。这是当时最先进的浏览器,它后来统治了 浏览器市场多年。 2001年,Douglas Crockford 提出了 JSON 格式,用于取代 XML 格式,进行服务器和网页之间的数据交换。JavaScript 可以原生支 持这种格式,不需要额外部署代码。 2002年,Mozilla 项目发布了它的浏览器的第一版,后来起名为 Firefox。 2003年,苹果公司发布了 Safari 浏览器的第一版。 2004年,Google 公司发布了 Gmail,促成了互联网应用程序(Web Application)这个概念的诞生。由于 Gmail 是在4月1日发布的, 很多人起初以为这只是一个玩笑。 2004年,Dojo 框架诞生,为不同浏览器提供了同一接口,并为主要 功能提供了便利的调用方法。这标志着 JavaScript 编程框架的时代 开始来临。 2004年,WHATWG 组织成立,致力于加速 HTML 语言的标准化进程。 2005年,苹果公司在 KHTML 引擎基础上,建立了 WebKit 引擎。 2005年,Ajax 方法(Asynchronous JavaScript and XML)正 式诞生,Jesse James Garrett 发明了这个词汇。它开始流行的标 本文档使用 书栈(BookStack.CN) 构建 - 25 -

26.历史 志是,2月份发布的 Google Maps 项目大量采用该方法。它几乎成 了新一代网站的标准做法,促成了 Web 2.0时代的来临。 2005年,Apache 基金会发布了 CouchDB 数据库。这是一个基于 JSON 格式的数据库,可以用 JavaScript 函数定义视图和索引。它 在本质上有别于传统的关系型数据库,标识着 NoSQL 类型的数据库诞 生。 2006年,jQuery 函数库诞生,作者为John Resig。jQuery 为操 作网页 DOM 结构提供了非常强大易用的接口,成为了使用最广泛的函 数库,并且让 JavaScript 语言的应用难度大大降低,推动了这种语 言的流行。 2006年,微软公司发布 IE 7,标志重新开始启动浏览器的开发。 2006年,Google推出 Google Web Toolkit 项目(缩写为 GWT),提供 Java 编译成 JavaScript 的功能,开创了将其他语 言转为 JavaScript 的先河。 2007年,Webkit 引擎在 iPhone 手机中得到部署。它最初基于 KDE 项目,2003年苹果公司首先采用,2005年开源。这标志着 JavaScript 语言开始能在手机中使用了,意味着有可能写出在桌面 电脑和手机中都能使用的程序。 2007年,Douglas Crockford 发表了名为《JavaScript: The good parts》的演讲,次年由 O’Reilly 出版社出版。这标志着软 件行业开始严肃对待 JavaScript 语言,对它的语法开始重新认识, 2008年,V8 编译器诞生。这是 Google 公司为 Chrome 浏览器而 开发的,它的特点是让 JavaScript 的运行变得非常快。它提高了 JavaScript 的性能,推动了语法的改进和标准化,改变外界对 JavaScript 的不佳印象。同时,V8 是开源的,任何人想要一种快 本文档使用 书栈(BookStack.CN) 构建 - 26 -

27.历史 速的嵌入式脚本语言,都可以采用 V8,这拓展了 JavaScript 的应 用领域。 2009年,Node.js 项目诞生,创始人为 Ryan Dahl,它标志着 JavaScript 可以用于服务器端编程,从此网站的前端和后端可以使 用同一种语言开发。并且,Node.js 可以承受很大的并发流量,使得 开发某些互联网大规模的实时应用变得容易。 2009年,Jeremy Ashkenas 发布了 CoffeeScript 的最初版 本。CoffeeScript 可以被转换为 JavaScript 运行,但是语法要 比 JavaScript简洁。这开启了其他语言转为 JavaScript 的风 潮。 2009年,PhoneGap 项目诞生,它将 HTML5 和 JavaScript 引入 移动设备的应用程序开发,主要针对 iOS 和 Android 平台,使得 JavaScript 可以用于跨平台的应用程序开发。 2009,Google 发布 Chrome OS,号称是以浏览器为基础发展成的 操作系统,允许直接使用 JavaScript 编写应用程序。类似的项目还 有 Mozilla 的 Firefox OS。 2010年,三个重要的项目诞生,分别是 NPM、BackboneJS 和 RequireJS,标志着 JavaScript 进入模块化开发的时代。 2011年,微软公司发布 Windows 8操作系统,将 JavaScript 作 为应用程序的开发语言之一,直接提供系统支持。 2011年,Google 发布了 Dart 语言,目的是为了结束 JavaScript 语言在浏览器中的垄断,提供更合理、更强大的语法和 功能。Chromium浏览器有内置的 Dart 虚拟机,可以运行 Dart 程 序,但 Dart 程序也可以被编译成 JavaScript 程序运行。 本文档使用 书栈(BookStack.CN) 构建 - 27 -

28.历史 2011年,微软工程师Scott Hanselman提出,JavaScript 将是互 联网的汇编语言。因为它无所不在,而且正在变得越来越快。其他语言 的程序可以被转成 JavaScript 语言,然后在浏览器中运行。 2012年,单页面应用程序框架(single-page app framework) 开始崛起,AngularJS 项目和 Ember 项目都发布了1.0版本。 2012年,微软发布 TypeScript 语言。该语言被设计成 JavaScript 的超集,这意味着所有 JavaScript 程序,都可以不 经修改地在 TypeScript 中运行。同时,TypeScript 添加了很多 新的语法特性,主要目的是为了开发大型程序,然后还可以被编译成 JavaScript 运行。 2012年,Mozilla 基金会提出 asm.js 规格。asm.js 是 JavaScript 的一个子集,所有符合 asm.js 的程序都可以在浏览 器中运行,它的特殊之处在于语法有严格限定,可以被快速编译成性能 良好的机器码。这样做的目的,是为了给其他语言提供一个编译规范, 使其可以被编译成高效的 JavaScript 代码。同时,Mozilla 基金 会还发起了 Emscripten 项目,目标就是提供一个跨语言的编译器, 能够将 LLVM 的位代码(bitcode)转为 JavaScript 代码,在浏 览器中运行。因为大部分 LLVM 位代码都是从 C / C++ 语言生成 的,这意味着 C / C++ 将可以在浏览器中运行。此外,Mozilla 旗 下还有 LLJS (将 JavaScript 转为 C 代码)项目和 River Trail (一个用于多核心处理器的 ECMAScript 扩展)项目。目 前,可以被编译成 JavaScript 的语言列表,共有将近40种语言。 2013年,Mozilla 基金会发布手机操作系统 Firefox OS,该操作 系统的整个用户界面都使用 JavaScript。 2013年,ECMA 正式推出 JSON 的国际标准,这意味着 JSON 格式 已经变得与 XML 格式一样重要和正式了。 本文档使用 书栈(BookStack.CN) 构建 - 28 -

29.历史 2013年5月,Facebook 发布 UI 框架库 React,引入了新的 JSX 语法,使得 UI 层可以用组件开发,同时引入了网页应用是状态机的 概念。 2014年,微软推出 JavaScript 的 Windows 库 WinJS,标志微 软公司全面支持 JavaScript 与 Windows 操作系统的融合。 2014年11月,由于对 Joyent 公司垄断 Node 项目、以及该项目进 展缓慢的不满,一部分核心开发者离开了 Node.js,创造了 io.js 项目,这是一个更开放、更新更频繁的 Node.js 版本,很短时间内 就发布到了2.0版。三个月后,Joyent 公司宣布放弃对 Node 项目 的控制,将其转交给新成立的开放性质的 Node 基金会。随后, io.js 项目宣布回归 Node,两个版本将合并。 2015年3月,Facebook 公司发布了 React Native 项目,将 React 框架移植到了手机端,可以用来开发手机 App。它会将 JavaScript 代码转为 iOS 平台的 Objective-C 代码,或者 Android 平台的 Java 代码,从而为 JavaScript 语言开发高性 能的原生 App 打开了一条道路。 2015年4月,Angular 框架宣布,2.0 版将基于微软公司的 TypeScript语言开发,这等于为 JavaScript 语言引入了强类型。 2015年5月,Node 模块管理器 NPM 超越 CPAN,标志着 JavaScript 成为世界上软件模块最多的语言。 2015年5月,Google 公司的 Polymer 框架发布1.0版。该项目的 目标是生产环境可以使用 WebComponent 组件,如果能够达到目 标,Web 开发将进入一个全新的以组件为开发基础的阶段。 2015年6月,ECMA 标准化组织正式批准了 ECMAScript 6 语言标 准,定名为《ECMAScript 2015 标准》。JavaScript语言正式进 本文档使用 书栈(BookStack.CN) 构建 - 29 -