《JavaScript 的诞生》

224 阅读4分钟

JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。

虽然JavaScript与Java在名字上和语法上有很多相似,但二者从被设计之初就有很大不同。JavaScript的语言设计来自Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言),而在语法结构上,JavaScript与C语言有很大相似性。

在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5和CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js。

诞生

JavaScript诞生于1995年,由布兰登·艾克(Brendan Eich)在网景公司(Netscape)任职期间发明。

在1994年,网景发布了历史上第一个比较成熟的网络浏览器,但仅可以用来浏览,不能实现与访问者互动,急需一种脚本语言实现浏览器与网页互动。

采用何种语言成为问题,一种是直接将Perl、Python、Tcl、Scheme等现有语言嵌入网页,另一种是开发新的语言,二者各有利弊。在当时,Sun公司推出了Java,网景与Sun进行合作,考虑用Java作为脚本语言,但最终因为会使HTML变动很复杂而放弃。

网景决定发明一种与Java搭配使用的辅助脚本语言并且语法上有些类似,比Java简单,使得非专业的网页作者也能很快上手。1995年5月,Brendan Eich为了应付公司安排,用了10天就把Javascript设计出来了。他的设计思路是:

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

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

1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。

概论

JavaScript包括3块内容:

  • ECMAScript,描述了该语言的语法和基本对象
  • 文档对象模型(DOM),描述处理网页内容的方法和接口
  • 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口

JavaScript特点:

  • 解释性脚本语言(代码不进行预编译)
  • 主要用于向HTMl添加交互行为
  • 可嵌入HTML,但单独成文件

JavaScript常用来完成以下任务:

  • 嵌入动态文本于HTML页面
  • 对浏览器事件作出响应
  • 读写HTML元素
  • 在数据被提交到服务器之前验证数据
  • 检测访客的浏览器信息
  • 控制cookies,包括创建和修改等

设计缺陷

阮一峰的博客罗列了JS的10个设计缺陷,例如:

  • 允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载
  • JS的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性
  • 在编程实践中,null几乎没用,根本不应该设计它
  • JS的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦
  • ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉
  • 基本类型的包装对象,与基本数据类型对应的对象类型,作用很小,造成的混淆却很大

阮一峰在博客最后写道,“最后,只要发布新版本的语言标准(比如 ECMAscript 5),就可以弥补这些设计缺陷。当然,标准的发布和标准的实现是两回事,上述的很多缺陷也许会一直伴随到Javascript存在的最后一天。”