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不仅支持类样式的继承,而且代码重用模式也是非常好的
没有评论:
发表评论