JavaScript 的诞生

313 阅读4分钟

"与其说我爱 Javascript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:'它的优秀之处并非原创,它的原创之处并不优秀。'" ——Brendan Eich

JavaScript 的发明人

image.png

布兰登·艾奇(Brendan Eich,1961年~),JavaScript 的发明人,2005年至2014年期间,在 Mozilla 公司担任首席技术长(Chief Technology Officer)。出任 Mozilla 的CEO十天就被迫辞职,因为捐助过反同性恋法案。

JavaScript 的诞生背景

1994年,网景公司(Netscape)发布了 Navigator 浏览器0.9版()。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。"

image.png

网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。

这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。

到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

就在这时,发生了另外一件大事:1995年 Sun 公司将 Oak 语言改名为 Java,正式向市场推出。

Sun 公司大肆宣传,许诺这种语言可以"一次编写,到处运行"(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。

image.png

“Java 是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。Java 语言中的许多库类名称,多与咖啡有关,如 JavaBeans (咖啡豆)、NetBeans (网络豆)以及 ObjectBeans (对象豆)等等。SUN 和JAVA 的标识也正是一杯正冒着热气的咖啡。”

JavaScript 一开始叫Mocha (摩卡),后面叫LiveScript,最后才叫 JavaScriopt

此时,34岁的系统程序员Brendan Eich登场了。1995年4月,网景公司录用了他。

Brendan Eich 的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。

仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须"看上去与 Java 足够相似",但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将 Perl、Python、Tcl、Scheme 等非面向对象编程的语言都排除在外了。

Brendan Eich被指定为这种"简化版Java语言"的设计师。

但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了。

由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。如果Brendan Eich预见到,未来这种语言会成为互联网第一大语言,全世界有几百万学习者,他会不会多花一点时间呢?

总的来说,他的设计思路是这样的:

  1. 借鉴C语言的基本语法;
  2. 借鉴Java语言的数据类型和内存管理;
  3. 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
  4. 借鉴Self语言,使用基于原型(prototype)的继承机制。

所以,Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

JavaScript 的部分缺陷

  1. null 属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义;
  2. 全局变量难以控制 Javascript 的全局变量,在所有模块中都是可见的;
  3. Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
  4. +号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。
  5. 由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。
  6. ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。

资料来源: 阮一峰:Javascript诞生记