原文地址 http://www.crockford.com/javascript/javascript.html
JavaScript
又叫做Mocha
、LiveScript
、JScript
、ECMAScript
,是世界上最流行的编程语言之一。几乎世界上每台电脑都至少安装了一个JavaScript
解释器并且在使用。JavaScript
如此流行完全归因于它是万维网的脚本语言。
尽管它很流行,可是JavaScript
是一门非常优秀的动态面向对象通用型的编程语言这一点却鲜为人知。这怎么可能是个秘密呢?为什么这门语言会被如此的误解?
名字
以Java-单词作为前缀似乎在暗示着JavaScript
和Java
语言怎么着也该有点关系,言下之意,JavaScript
是Java
语言的一个子集或者功能稍弱的一个Java
版本。仿佛这个名字自始之初就是为了给人制造困惑,最后让人产生误解。JavaScript
不是Java
,Java
才是Java
。JavaScript
是一门不同的语言。
JavaScript
和Java
语法有很多的相似性,就像Java
和C
语言那样。但是JavaScript
并不是Java
的一个子集,就像Java
不是C
语言的子集一样。在起初打算使用Java
的应用中,JavaScript
表现比Java`更优秀。
JavaScript
的诞生地是网景公司,而不是Java
的老家Sun
公司。刚开始它的名字叫做LiveScript,但是这个名字还不够让人迷惑。
以单词 -Script为后缀表明它不是一门真正的编程语言,通常意义上讲,脚本语言的功能要弱于编程语言。与C语言相比,JavaScript牺牲了性能换来了强大的表达能力以及动态特性。
披着C语言外衣的Lisp语言
JavaScript
的类C
文法,包括大括号和笨重的声明,使得他它看起像一门普通的过程式语言。这是个误导,因为JavaScript
和Lisp
以及Scheme
这类的函数式语言更像,和C
语言以及Java
倒不大像。它有数组而不是列表,它有对象而不是属性列表。函数是一阶公民。它有闭包,你可以使用lambda
特性而不需要去考虑对齐所有的括号。
身份转换
JavaScript
设计之初运行于网景浏览器中。其成功使得JavaScript
成为几乎所有web
浏览器的标配。这导致身份转换。JavaScript
是一门程序设计语言。JavaScript
同样适合于许多非web
类的应用场景
“日新月异”
JavaScript的初期版本功能有限,缺乏异常处理机制,内置函数以及继承。而如今的JavaScript俨然已是一门完整的面向对象的编程语言。但是现在的很多语言特性都是基于早期的不成熟形式。管理这门语言的ECMA委员会正在不断扩展这门语言,尽管是好心,但是却带来了非常大的问题。这门语言已经有太多的版本了,太混乱了。
设计错误
没有堪称完美的编程语言。JavaScript同样有设计错误,比如对+
的重载,既表示加法又表示强制类型转换进行拼接,还有易于出错的with
语句应该被避免掉。将单词policies
作为保留字显得太过严苛。分号插入是个严重的错误,就像正则表达式里分号的记号那样。这些过失已经导致了程序设计错误,并且使得整个语言的设计成为问题。幸运的是,许多这类问题可以通过一个好的lint
程序来规避。
总体来说,语言的整体设计是非常出色的。令人吃惊的是,ECMAScript
委员会似乎志不在修复这些问题。也许他们意在制造更多的麻烦。
糟糕的实现
早期JavaScript
的某些实现版本实在是不敢恭维。语言显得很糟糕。祸不单行,那些(糟糕的)实现版本被嵌入到更糟糕的浏览器中。
垃圾书籍
几乎所有关于JavaScript
的书籍写的都很烂. 书中包含了错误、糟糕的代码示例,并且提倡一些不好的实践方式。语言中的一些重要的特性经常被解释的很糟糕或者根本不被提及。 我审阅了许多JavaScript的书籍, 并且** 我只推荐一本**: JavaScript: 权威指南 (第五版) 作者 David Flanagan. (注意了作者们: 如果你写了一本, 请寄给我我一本审校版.)
不合格的标准
JavaScript语言官方文档 由ECMA
发布。文档质量令人堪忧:难于阅读并且难以理解。这似乎是哪些垃圾书籍的始作俑者,因为作者们很难通过标准文档来提高他们对该们语言的理解水平。ECMA
组织以及TC39
委员会应该深感自责。
业余的开发者
绝大多数JavaScript
开发人员都是非科班程序员。他们没有受过正规训练以及缺乏写优秀代码的自律精神。JavaScript
语言表达能力如此之强可用用来干很多事。如此一来这使得JavaScript
赢得了一个业务爱好者们的语言的美誉,换言之JavaScript
不适合专业的编程开发。事实并非如此。
面向对象
JavaScript
是面向对象的吗?它有对象,这些对象包含了数据和操纵数据的方法。对象可以包含其它对象。它没有类,但是它有构造函数其作用和类的作用一样,作为类变量以及方法的容器.JavaScript
不是基于类的继承,它是基于原型的继承。
构建对象系统的两种主要方式是继承(is-a
)和聚合(has-a
)。JavaScript
两者都支持,但它的动态特性使得它在聚合方面表现的更好。
有人认为JavaScript
不是真正的面向对象,因为它不提供信息隐藏。 也就是说,对象不能有私有变量和私有方法:所有成员都是公共的。
但事实证明,JavaScript
对象可以有私有变量和私有方法。 (点击这里了解更多)当然,很少有人理解这一点,因为JavaScript
是世界上最被误解的编程语言。
有人认为JavaScript
不是真正的面向对象,因为它不提供继承。 但事实证明,JavaScript
不仅支持经典的继承方式,还支持其他代码重用模式。
Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.