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

来源:互联网 发布:淘宝划线价格怎么设置 编辑:程序博客网 时间:2024/04/29 16:46
译注:本文译自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不仅提供经典的继承,也提供其它的代码重用模式。
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 坐便池上面的小孔不出水怎么办 还没离职已经找好工作怎么办 因火车晚点而耽误下趟火车怎么办 在广州坐的士丢了东西怎么办 找兼职的话他要求交押金怎么办 08vip不给提现了怎么办 点击订阅号所收到内容字太大怎么办 我的小叶栀子花老是黄叶该怎么办? 联币金融倒闭了我投资的钱怎么办 新单位交养老保险不接收档案怎么办 高铁发车十小时没赶上怎么办 饿了么被阿里收购员工怎么办? 爱疯4s密码忘了怎么办 研究生论文盲审一直不出结果怎么办 查重报告有疑似剽窃观点怎么办 成绩考的不好怎么办读技校有用吗 孩子大学挂科太多家长应该怎么办 中专升大专的入学考没考上怎么办 小孩摔跤额头出了个包怎么办 小孩摔跤后脑勺出了个包怎么办 结婚后疏于关心老婆寒心了怎么办 江苏取消小高考高二学生怎么办 上海学而思家长陪读听不懂怎么办 高考报名的电话号码填错了怎么办 高考报名用的电话号码变换了怎么办 弟媳妇一个月就大闹一次怎么办 丈夫出轨我亲弟媳妇我怎么办 被山西博大泌尿医院坑了怎么办 家长反应孩子学校受欺负老师怎么办 白色衣服和牛仔裤洗变色了怎么办 生完孩子肚子上的松皮怎么办 xp电脑玩cf进入地图黑屏怎么办 爸妈吵架妈妈走了爸爸哭了该怎么办 总担心旅馆被拍视频传上网怎么办 微博买了猜冠军现在停了怎么办 脸上毛孔大有黑头怎么办小窍门去 进去精神病院出来真的疯了怎么办 房子已过户新业主不交物业费怎么办 村委会欠百姓征地补偿款不给怎么办 因为近亲人人都不看好的婚姻怎么办 碰到工作中特别积极的同事怎么办