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

译注:本文译自Douglas Crockford的《 JavaScript:The World's Most Misunderstood Programming Language》,是难得一见的好文!
 
JavaScript(也被称为Mocha,LiveScript,JScript,ECMAScript)是世界上最流行(most popular)的程序设计语言之一。基本上每台PC都至少有一个JavaScript解释器在运行,这要归功于JavaScript是Web的脚本语言。
 
除了其流行之外,很少有人知道JavaScript还是一种非常优美的、动态的、面向对象的、通用的程序设计语言。这怎么会成为一个秘密?这种语言为什么会被如此误解?
 
名字

Java-前缀使人认为JavaScript多少与Java有关系,是Java的子集或缩减功能后的版本。似乎这个名字是有意用来制造混淆,且从混淆产生误解。实际上,JavaScript并不是Java的解释版本,Java是Java,JavaScript是一种不同的语言。
 
JavaScript在语法上类似于Java,就像Java类似于C一样。JavaScript是Java的子集并不比Java是C的子集多什么东西。JavaScript比Java能更好地应用于Java(当时称为Oak)原初的设计目的。
 
JavaScript并不是在Sun Microsystems公司开发的,而是在Netscape。当初叫LiveScript,如果叫这个名字,就不会产生如此多的误解。
 
-Script后缀会使人认为不是一种实际的(real)程序设计语言,会认为脚本语言在功能上比程序设计语言差很多。但这实际上是特化问题(a matter of specialization,可能是指JavaScript只是专注于某些领域或在某些方面有特长——译注),与C相比,JavaScript在性能和表达能力及活力(dynamism)上取得了一种平衡。
 
穿着C的衣服的Lisp
 
JavaScript类似于C的语法,包括花括号({})以及重量级的(clunky)for语句,使其看起来与通常的过程语言没什么不同。实际上这是误导,因为与C或Java比起来,JavaScript与函数式语言如Lisp或Scheme具有更多的共同点。JavaScript用数组代替了列表(lists),用对象代替了属性列表(property lists),函数是第一级别的(first class),而且JavaScript具有closures(closures与lambda表达式有关,将在以后展开来谈——译注),用不着平衡所有那些括号就可以得到lambda表达式(You get lambdas without having to balance all those parens.——译注:虽然翻出来了,但意思还是不太明白,是指与Lisp相比吗?Lisp确实要balance all those parens)。
 
擅长角色(Typecasting)

JavaScript是被设计来运行于Netscape Navigator浏览器中的,它的成功使其成为所有浏览器的标准配置,这倒成了JavaScript所擅长的角色。实际上JavaScript是程序设计语言中的George Reeves(美国演员,饰演电视系列剧《超人历险记》中的超人——译注),它能很好地适用于一大类的非Web应用程序。
 
目标游移(Moving Target)

JavaScript初始的几个版本功能非常弱,缺少异常处理,内函数(inner functions),以及继承。目前它已经是一个完全的面向对象的程序设计语言。但对于该语言的很多意见都集中于其不成熟的形式。
 
ECMA委员会(JavaScript语言的管理者)正在开发各种扩展,但这些扩展会更加恶化其最大的问题:它已经有太多的版本了。版本太多不可避免会产生混淆。
 
设计错误
 
没有一种程序语言是完善的。JavaScript同样有设计错误,如重载+操作符,通过强制类型转换,使其用于加法和字符串连接,以及容易产生错误的with语句。保留字策略限制太严,分号插入(semicolon insertion),与直接量的正则表达式记法一样,是一个巨大的错误。这些错误已经导致了各种各样的程序设计错误。语言的设计作为一个整体已经使人产生怀疑。幸好,这些问题可以通过一个很好的lint程序得到缓解。
 
语言的设计在整体上还是很合理的,奇怪的是,ECMA委员会似乎对改正这些问题并没有兴趣,或许他们对制造新的问题兴趣更大。
 
极坏的实现
 
JavaScript的几个早期实现充满了缺陷(quite buggy),这对语言影响很坏,而且这些实现又嵌入在可怕的缺陷多多的Web浏览器里。
 
坏的书籍
 
几乎所有关于JavaScript的书都很糟糕,有错误,低劣的例子,并倡导一些不好的实践。语言的重要特性经常被低劣地解释,或整个忽略掉了。我看了很多JavaScript的书,只推荐一本:David Flanagan的《JavaScript: The Definitive Guide (5th Edition)》。
 
不够标准的标准
 
ECMA出版JavaScript语言的官方规范,可这个规范的质量却极为低劣。难读难懂(难怪我读不懂,现在看来是可以原谅的:)——译注)!这是产生上述坏书问题的一个原因,因为作者无法用标准文档改进他们对语言的理解。ECMA和TC39委员会应该很尴尬。
 
业余爱好者
 
许多写JavaScript程序的人都不是程序员,他们对如何写好的程序缺乏训练。JavaScript具有很强的表达能力,他们怎么写都可以做点有用的事情,这造成了JavaScript只适用于业余爱好者,而不适合专业程序员的形象。事实当然不是。
 
面向对象
 
JavaScript是面向对象的吗?它有包含数据的对象以及处理数据的方法,对象可以包含其它的对象。它没有类,但有构造函数,能起到类的作用,如作为类变量和类方法的容器。没有面向类的继承(class-oriented inheritance),但有面向原型的继承(prototype-oriented inheritance)。
 
构建对象系统的两种主要方式,一是通过继承(is-a),一是通过聚集(has-a),JavaScript两种方式都有,其动态特性使其在聚集方面更优秀。
 
一些人会争辩,说JavaScript并非真正面向对象,因为不能提供信息隐藏,也就是说,对象没有私有变量和私有方法,所有成员都是公共的。但JavaScript的对象可以有私有变量和私有方法,当然,很少人理解,因为JavaScript是世界上误解最深的语言。
 
一些人会争辩,说JavaScript并非真正面向对象,因为不提供继承。但JavaScript不仅提供经典的继承,也提供其它的代码重用模式。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值