2007年3月8日

JavaScript 世界上最被误解的程序设计语言

JavaScript, 也被称为Mocha, LiveScript, JScript或是ECMAScript,是世界上最为流行的编程语言之一。事实上世界上每一台个人电脑都至少安装了一个JavaScript解释程序,并且它处于使用之中。JavaScript的流行完全取决于它作为万维网(WWW)脚本语言的角色。

尽管它很流行,却很少有人知道它是一个非常精致动态的基于对象的程序语言(dynamic object-oriented general-purpose programming language)。这为何会成为一个奥秘呢?又为什么这个语言如此被误解呢?

名称

Java-前缀暗示着不是为何涉及到了Java,就像Java的一个子集或是Java的某个版本。看起来名称的选择引起了混淆,并且这种混淆引起了误解。JavaScript不能被认为是Java,Java就是Java,JavaScript是完全不同的另一门语言。

JavaScript在语法与Java有类似之处,非常像Java与C语言一样。但是JavaScript不是Java的子集就像Java不是C语言的子集一样。Java(最初叫Oak)在应用程序中要比最初设想的好的多。

JavaScript不是开发Java的Sun公司开发的。JavaScript是由网景公司(Netscape)开发的,它最初被叫做LiveScript,这个旧名字并没有把一切搞乱。

-Script后缀暗示着它不是一个真正的程序语言,一个脚本语言要比程序语言少很多东西,但却真正地限定了它的作用。与C语言相比,JavaScript用表现力和活力交换了性能。

披着C语言外衣的LISP语言

JavaScript的像C语言的语法,包含了大括弧方式,隐式的声明,使它呈现出一个普通的过程语言(procedural language)的模样,这是被误解的。因为JavaScript更多地与功能语言相似就像LISP或Scheme与C语言和Java相比。它用数组代替了表(List),对象代替了属性表,函数是第一级的,闭包(closures)的。你可以使用微升而不必平衡所有的parens。(You get lambdas without having to balance all those parens.)

思维定势

JavaScript被设计在网景浏览器上运行,它成功地成为了所有浏览器的标准装备。这导致了思维定势,JavaScript是George Reeves似的语言,它也非常适合于非Web相关的应用程序。

发展的目标

JavaScript的一个版本是相当弱,它缺乏异常处理,内部方法和继承。以如今的形式来看,它是一个完整的面向对象的程序设计语言。但是许多看法都是基于它不成熟的形式的。

ECMA的指导委员会用心良苦地推动了JavaScript的发展,但是却带来了一个语言最大的问题:已经有太多的版本了。这无疑增加了混淆。

设计问题

没有一种编程语言是完美的,JavaScript也有它的部分设计问题,比如说:+可以对不同的类型进行加法和连接字符串的作用;具有错误倾向的with语句应该被避免的;保留字的方针过于严格了;分号(<;)插入了大量的错误,如正则表达式符号。这些问题导致了程序错误,使这个语言的整体陷于这些问题之中。幸运地是可以通过lint程序减轻这些问题。

整个语言的设计是大体上是合理的。令人惊讶的是,ECMAScript的指导委员没有意愿要纠正这些问题。肯能他们对制作一个全新的脚本语言更感兴趣。

糟糕的实现

JavaScript的早期的实现充满了bug,这些问题严重地反映在语言上。混合起这些,那些实现被嵌入到那些可怕的糟糕的web浏览器中。

劣质的书籍

几乎所有的关于JavaScript的书都是非常糟糕的,里面充斥着错误,低劣的例子,并且提升了不好的习惯。语言的重要特性往往被解释不好,或者干脆没有。我回顾许多关于JavaScript的书籍,我只推荐一本由David Flanagan著的JavaScript: The Definitive Guide (5th Edition)(译者注:《Javascript通用指南(第5版)》,也就是传说中的“犀牛书”)。(提醒作者们:如果你写了一本好的,请发给我一本赠阅本)

低于标准的标准

ECMA出版的JavaScript语言官方规范手册,这个手册是非常地劣等,它非常难以阅读和理解,这就是那些作者写出劣质书籍的原因把,因为那些作者不能用这个手册来提升他们对JavaScrpt的理解。 ECMA和TC39应该为此感到羞愧。

业余程序员

大多数写JavaScript程序并不是真正的程序员,他们缺乏训练来写好程序。尽管JavaScript拥有如此丰富的表现力,但是他们却不把它用到有用的地方去,这使JavaScript落下了一个“业余者的语言”的称谓,并且不适合专业的程序。这显然不是事实。

面向对象(Object-Oriented)

JavaScript是面向对象的吗?它可以拥有数据和遵照数据的方法,对象可以包含其他对象。它没有类,但是它有像类一样的构造器,来担当类的方法和变量的容器。它没有面向类的接口,但是它确实有面向原型(prototype-oriented)的接口.

建造对象系统的两个主要方式是继承(is-a) 和聚集体(has-a),JavaScript都拥有,但是它动态的天性使它更擅长于聚集体。

一些观点认为JavaScript不是真正地面向对象因为它不能提供信息的隐藏。的确如此,对象不能有私有变量和私有方法:所有的成员都是公开的。但是这个观点切断了JavaScript的对象可以拥有私有的变量和私有方法(点这里看看如何实现) 当然很少有人能理解这些,因为呢,JavaScript 世界上最被误解的程序设计语言

一些观点认为JavaScript不是真正地面向对象因为它不能提供继承,但是这也切断了JavaScript不仅支持类样式的继承,而且代码重用模式也是非常好的

特别声明,文章翻译于JavaScript: The World's Most Misunderstood Programming Language
版权由原作者所有。

没有评论: