JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。以下讲述了JavaScript的诞生过程以及它的一些设计缺陷。
1994年,网景公司发布了Navigator浏览器0.9版。他们急需一种网页脚本语言,使得浏览器可以与网页互动。就在他们无法决定采用现有的语言还是发明一种全新的语言的时候,1995年Sun公司正式向市场推出Java。网景公司决定与Sun公司结成联盟,它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。
1995年4月,网景公司录用了34岁的系统程序员Brendan Eich。5月,他被指定设计一种“看上去与Java足够相似,但是比Java简单,使得非专业的网页作者也能很快上手”的网页脚本语言。也因此这种语言取名为JavaScript。他只用10天时间就把Javascript设计出来了,由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。
Brendan Eich的设计思路是这样的:
- 借鉴C语言的基本语法;
- 借鉴Java语言的数据类型和内存管理;
- 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
- 借鉴Self语言,使用基于原型(prototype)的继承机制。
所以,Javascript语言实际上是两种语言风格的混合产物————(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。
也正是因为设计阶段过于仓促、没有先例、过早的标准化,导致JavaScript有一些设计缺陷,主要有以下10个设计缺陷:
- 不适合开发大型程序。
- 非常小的标准库。
- null和undefined两者非常容易混淆,但是含义完全不同。
- 全局变量难以控制。
- 自动插入行尾分号。有时候,这会导致一些难以发现的错误。
- 加号运算符有两个含义,可以表示数字与数字的和以及表示字符与字符的连接。这加剧了运算的复杂性。
- NaN表示超出了解释器的极限。它有一些很奇怪的特性不利于简化程序。
- 数组和对象的区分:由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。
- == 和 ===:==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。推荐任何时候都使用"==="。
- 基本类型的包装对象:Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。
虽然JavaScript有这些缺陷,但它的编程能力强大,如果遵守良好的编程规范,加上第三方函数库的帮助,Javascript的这些缺陷大部分可以回避。
本文参考: