第一章:什么是 JavaScript?
目前为止你还不了解 JS。我也不了解,反正不完全了解。我们都不了解。但我们都可以开始更好地了解 JS。
在你并不了解 JavaScript(YDKJSY)系列第一本书的第一章中,我们将花一些时间来夯实地基,以便继续前行。我们需要从涵盖各种重要的背景细节开始,澄清一些关于语言真正是什么(和不是什么!)的神话和误解。
这是对如何组织和维护 JS 的特征和过程的宝贵见解;所有 JS 的开发者都应该了解它。如果你想了解 JS,这就是如何入门并开始这段旅程的第一步。
关于本书
我强调旅程这个词是因为了解 JS 不是目的,而是一个方向。无论你在这门语言上花了多少时间,你总能找到更好的东西来学习和理解它。所以不要把这本书看成是急于求成的东西。相反,耐心是生活的关键。
在这一章节之后,本书的其余部分列出了一张高层次的图谱用来说明你在使用 YDKJSY 书籍挖掘和研究 JS 时将发现什么。
特别是第四章指出了 JS 语言的三个主要支柱:作用域/闭包、原型/对象,以及类型/强制转换。JS 是一种广泛而复杂的语言,有许多特性和能力。但是所有的 JS 都是建立在这三个基本支柱之上的。
请记住,尽管这本书的标题是「入门」,但它不是作为一本初学者/入门书的。本书的主要工作是让你为在本系列的其他部分深入学习 JS 做好准备;它的写作是假设你在学习 YDKJSY 之前已经有了至少几个月的熟练的 JS 的经验。因此,为了从入门中获得最大的收益,请确保你拥有花大量的时间编写 JS 代码的经验。
即使你以前已经写过很多 JS,这本书也不应该被略过或跳过;要花时间充分理解这里的内容。不积跬步,无以至千里;不积小流,无以成江海。
名字的由来
JavaScript 这个名字可能是最错误和容易被误解的编程语言名称。
这种语言与 Java 有关吗?它只是 Java 的脚本形式吗?它只用于编写脚本而不是真正的程序吗?
事实上,JavaScript 这个名字是营销诡计的一个产物。当 布兰登·艾克 (Brendan Eich) 第一次构思这种语言时,他将其命名为 Mocha。网景内部则使用 LiveScript。但到了公开命名该语言的时候,‘JavaScript’ 赢得了投票。
为什么呢?因为这种语言最初是为了吸引大部分 Java 程序员而设计的,而且「脚本 (Script) 」这个词在当时很流行,指的是轻量级程序。这些轻量级的「脚本」将是第一个在网络这个新事物上嵌入页面的!
换而言之,JavaScript 是一种营销策略,试图将这种语言定位为一种可接受的替代品,以替代当时更重、更知名的 Java。就这一点而言,它也可以很容易地被称为 ‘WebJava’。
JavaScript 的代码和 Java 的代码之间有一些表面上的相似之处。这些相似之处并不是共同发展的理念,而是因为两种语言都以 C 语言(在某种程度上,C++)的假设语法期望为目标的开发者。
例如,我们用{
来开始一个代码块,用}
来结束这个代码块,就像 C/C++ 和 Java 一样。我们还使用;
来标明语句的结束。
在某些方面,法律关系甚至比语法更深。甲骨文公司(通过 Sun 公司),这个仍然拥有并运行 Java 的公司,也拥有 “JavaScript” 这个名字的官方商标(通过网景通信)。这个商标几乎从来没有被执行过,而且现在很可能也不能被执行。
出于这些原因,有些人建议我们使用 JS 而不是 JavaScript。这是一个非常常见的简写,如果不是一个官方语言品牌本身的良好候选者的话。事实上,这些书籍几乎完全使用 JS 来指代这种语言。
为了进一步将该语言与甲骨文公司拥有的商标拉开距离,TC39 规定并由 ECMA 标准机构正式确定的语言的官方名称是 ECMAScript。事实上,自 2016 年以来,官方语言名称也以修订年份作为后缀;截至本文撰写之时,为 ECMAScript 2019,或缩写为 ES2019。
换句话说,在你的浏览器或 Node.js 中运行的 JavaScript/JS,是基于 ES2019 标准的实现。
注意: |
---|
不要使用诸如 ‘JS6’ 或 ‘ES8’ 之类的术语来指代该语言。有些人会这样做,但这些术语只会使混乱持续下去。你应该坚持使用 ‘ES20xx’ 或只是 ‘JS’。 |
无论你叫它 JavaScript、JS、ECMAScript 还是 ES2019,它都绝对不是 Java 语言的一个变体!
「Java 之于 JavaScript 就像雷锋之于雷峰塔。」 -Jeremy Keith, 2009 1
语言规范
我提到了管理 JS 的技术指导委员会 TC39,他们的主要任务是管理语言的官方规范。他们定期开会,对任何商定的修改进行表决,然后将其提交给标准组织 ECMA。
JS 的语法和行为是在 ES 规范中定义的。
ES2019 恰好是 JS 自 1995 年成立以来的第 10 个主要编号规范/修订版,因此在 ECMA 规范的官方 URL 中,您会发现 ‘10.0’:
https://www.ecma-international.org/ecma-262/10.0/
TC39 委员会由 50 至约 100 名不同的人员组成,他们来自广泛的网络投资公司,如浏览器制造商(Mozilla、谷歌、苹果)和设备制造商(三星等)。委员会的所有成员都是志愿者,尽管他们中的许多人是这些公司的员工,但也可能因其在委员会的职责而获得部分报酬。
TC39 一般每隔一个月召开一次会议,通常为期三天,审查成员自上次会议以来所做的工作,讨论问题,并对提案进行表决。会议地点由愿意主办的成员公司轮流决定。
所有的 TC39 提案都要经过五个阶段的过程。当然,因为我们是程序员,所以是以 0 来开始的:阶段 0 到阶段 4。你可以在这里阅读更多关于该阶段过程的信息:https://tc39.es/process-document/
阶段 0 的意思是,TC39 的某个人认为这是一个有价值的想法,并计划支持和努力实现它。这意味着很多非 TC39 成员通过社交媒体或博客文章等非正式途径「提出」的想法实际上是「阶段 0 之前的」。你必须得到 TC39 成员的支持,它才能被正式视为「阶段 0」。
一旦一个提案达到「阶段 4」的状态,它就有资格被纳入下一年的语言修订中。一项提案可能需要几个月到几年的时间来完成这些阶段的工作。
所有提案都在 TC39 的 GitHub 存储库上进行公开管理:https://github.com/tc39/proposals
任何人,无论是否是 TC39 的成员,都欢迎参与这些公开讨论和提案的工作进程。但是只有 TC39 成员可以参加会议,并对提案和修改进行投票。因此,TC39 成员的声音对 JS 的走向有很大的影响。
与一些既定的、令人沮丧的神话传说相反,并不存在多个版本的 JavaScript。只有一个 JS,即由 TC39 和 ECMA 维护的官方标准。
早在 21 世纪初,当微软维护一个名为 ‘JScript’ 的分支和逆向工程(但并不完全兼容)JS 版本时,JS 就在那时有了合法的「多个版本」。但是那些日子已经一去不复返了。今天对 JS 做出这样的断言是过时和不准确的。
所有主要的浏览器和设备制造商都承诺使他们的 JS 实现符合这一个中心规范。当然,引擎在不同时期实现的功能也不同。但是,V8 引擎(Chrome 的 JS 引擎)与 SpiderMonkey 引擎( Mozilla 的 JS 引擎)相比,在实现特定的功能时,不应该出现不同或不兼容的情况。
这意味着你可以学习一种版本的 JS,并在任何地方都使用它。
网络主宰着(JS)的一切
虽然运行 JS 的平台在不断扩大(从浏览器,到服务器(Node.js),到机器人,到灯泡,到…),但统治 JS 的还是环境是网络。换句话说,JS 如何在网络浏览器上实现,在所有的实际情况下,是唯一重要的现实。
在大多数情况下,规范中定义的 JS 和基于浏览器的 JS 引擎中运行的 JS 是一样的。但也有一些必须考虑的差异。
有时 JS 规范会规定一些新的或改进的行为,但这与基于浏览器的 JS 引擎的工作方式不完全匹配。这种不匹配是历史遗留问题: JS 引擎已经有 20 多年的可观察到的行为,围绕着那些已经被网络内容所依赖的功能的角落案例。因此,有时 JS 引擎会拒绝符合规范规定的变化,因为这会破坏现有的网络内容。
在这些情况下,往往 TC39 会反其道而行之,只是选择让规范符合网络的现实。例如,TC39 计划为数组增加一个contains(..)
方法,但发现这个名字与一些网站仍在使用的旧 JS 框架相冲突,所以他们把这个名字改为不冲突的includes(..)
。同样的情况也发生在被称为 “smooshgate” 的喜剧/悲剧性 JS 社区危机中,计划中的flatten(..)
方法最终被改名为flat(..)
。
但偶尔,TC39 会决定规范应该在某些方面坚持到底,尽管基于浏览器的 JS 引擎不太可能符合规范。
解决方案是什么?附录 B,「用于 Web 浏览器的附加 ECMAScript 功能」。2 JS 规范包括本附录,以详细说明官方 JS 规范与 JS 在网络上的实际情况之间的任何已知不匹配。换句话说,这些是只允网络 JS 的例外情况;其他 JS 环境必须遵守规范。
B.1 和 B.2 章节涵盖了网络 JS 的附加功能(语法和 API),这也是出于历史原因,但 TC39 并不打算在 JS 的核心中正式规定。例子包括0
前缀的八进制字,全局的escape(..)
/unescape(..)
工具,字符串「助手」如anchor(..)
和blink()
,以及 RegExpcompile(..)
方法。
B.3 章节包括一些冲突,在这些冲突中,代码可能同时在网络和非网络 JS 引擎中运行,但其行为可能明显不同,导致不同的结果。大多数列出的变化涉及到代码在严格模式下运行时被标记为早期错误的情况。
附录 B Gotcha
。「Gotcha,在计算机编程领域中是指在系统或程序、程序设计语言中,合