您的当前位置:首页正文

JavaScript:世界上最被误解的语言

2020-11-27 来源:易榕旅网

JavaScript,也叫Mocha,LiveScript,JScript,ECMAScript,是世界上最受欢迎的编程语言之一。事实上,世界上每个人的个人电脑上至少安装了一种JavaScript的解释器,并且被广泛地使用着。JavaScript如此受欢迎的原因在于它在万维网中所扮演的脚本语言的角色。

名字

Java这个前缀的暗示使得人们总会把JavaScript和Java联系起来,认为JavaScript是Java的一个子集或者是一个功能差于Java的一个版本。似乎JavaScript这个名字就是有意造成一种混淆,而这种混淆带来了后来的误解。JavaScript不被解释成Java,Java就是Java。而JavaScript则是另一种不同的编程语言。

JavaScript的语法和Java相类似,这就像Java和C类似一样。但是,JavaScript并不是Java的一个子集就像Java不是C的子集。JavaScript在应用程序方面比Java(Oak)当初所打算的表现地更好。

JavaScript并不是在Java的诞生地——Sun Microsystems公司,被开发出来的,而是在Netscape(网景)被开发出来的。它最初被叫做LiveScript,而这个名字并没有让人们很迷惑。

Script这个后缀的暗示,说明JavaScript不是一种真正的“编程语言”,作为一门脚本语言和编程语言相比,还是有差距的。但是,这的确是一个专业化的问题。和C语言相比,JavaScript通过牺牲性能而换取更加丰富的表达能力和动态性。

披着 C 外衣的 Lisp

JavaScript的类 C 语法,包括花括号和笨重的for语句,使得它看起来更像是一种普通的过程式的语言。这是一种误导,因为和C 或 Java相比,JavaScript 和 函数式语言——比如 Lisp 和 Scheme,有着更多的相似之处。它用数组代替列表,用对象代替属性列表。函数是第一类型,函数可以有闭包。你不需要去平衡所有的这些圆括号,就可以使用匿名函数。

语言类型定型

JavaScript最初的设计是运行在Netscape Navigator上的。它的成功使它事实上成为了所有网页浏览器的标准配置。这就造成了语言类型的定型。可以说,JavaScript就是编程语言中的 George Reeves(注:美国演员,因扮演“超人”出名,导致被定型,而无法接演其他角色)。JavaScript也适用于很多和网页无关的应用程序。

变动的(语言设计)目标

JavaScript的第一个版本相当的弱。它缺少异常处理、内部函数、继承。就它现在的形式而言,它已经是一门完整的面向对象的编程语言了。但是,针对这门语言的很多观点都是基于它不成熟的形式而引发的。
负责管理这门语言的ECMA委员会正在开发扩展,这本是出于好意,但是这也加剧了一个更大的问题:版本变得越来越多。而这造成了更多的困扰。

设计错误

没有任何编程语言是完美的。JavaScript也有它本身设计错误,比如重载表示相加和附带类型转换的串连接两个含义,易错的with语句也应该避免使用。保留字策略过于严格。分号的嵌入也是一个巨大的错误,正则表达式的符号也是一样。这些错误会导致编程错误,同时将语言的设计作为一个整体质疑。幸运地是,这些问题中的很多问题可以用一个非常不错的 Lint 程序来缓和。

这个语言的设计整体上是相当健全的。令人惊讶地是,ECMAScript委员会似乎对于纠正这些错误并不感兴趣。也许,他们对创造一个新的语言更感兴趣吧。(注:这里应该是作者的调侃语)。

糟糕的实现

JavaScript早期的一些实现可谓是错误百出。这一点反映在语言上。更糟糕地是,这些实现被嵌入到了更加错误百出的web浏览器之中。

糟糕的参考书籍

几乎所有关于JavaScript的书籍都相当地糟糕。它们充满了错误,不恰当的例子,和没什么帮助的练习。这门语言中的重要特性被糟糕地解释,或者被完全忽略。我修订过很多关于JavaScript的书籍,但是我只推荐一本:《JavaScript权威指南(第五版)》——作者:David Flanagan。(作者语:如果你写了一本很好的书,请给我邮递一本赠阅本。)

不合格的标准

JavaScript的官方规范是由ECMA出版的。这个官方规范的质量相当的低。而且难以阅读和理解。这是一个造成拙劣书籍问题的一个原因,因为作者们无法使用标准文档来提升他们对语言的理解。ECMA和TC39委员会应该为此感到深深地窘迫和不安。

业余爱好者

很多使用JavaScript的人并不是程序员。他们缺乏专业素质和编写优秀程序的训练。无论如何,JavaScript拥有如此强大的表现力,以致于他们通过使用JavaScript可以做很多有意义的事情。这就让JavaScript背上了一个名声,就是说,JavaScript完全是给业余人员设计的语言,它不适合用于专业编程。其实,事实并非如此。

面向对象

JavaScript是面向对象的吗?它拥有对象,它的对象可以包含数据和处理数据的方法。对象中可以包含其他的对象。它没有类,但是它有构造函数,通过构造函数可以做类似于类的操作,包括充当类变量和方法的容器。它没有面向类的继承,但是它有面向原型的继承。

创建对象体系的两个主要方式分别是通过继承和通过聚合。JavaScript两个方法都有,但是它的动态性使得它可以在聚合的基础上变得更加优秀。

一些争论认为JavaScript不是一门真正的面向对象,因为它不支持(提供)信息的隐藏。也就是说,对象不能拥有私有变量和私有方法:所有的成员都是公共的。

但是又有证明显示,JavaScript中的对象可以有私有变量和私有方法。(注:原文中,作者这里是一个链接,介绍关于对象私有变量和私有方法的文档)当然,很少有人理解这一点,因为JavaScript是世界上最被误解的编程语言。(注:作者这里使用了一种轻松的调侃方式)。

一些争论认为JavaScript不是一门真正的面向对象,因为它不支持继承。但是这又被证明JavaScript不仅能支持传统的继承还能应用其它的代码复用模式。(注:原文这里仍然是一个链接)

版权2001年道格拉斯Crockford。版权所有Wrrrldwide。

【推荐课程:Javascript视频教程】

显示全文