一个只花了天就开发完成的脚本语言自从诞生开始就一直成为人们争论的焦点尽管这样它在编程语言中地位仍然无法动摇全世界有几百万学习者和粉丝而本文的作者认为JavaScript设计之匆忙初衷仅仅实现简单的网页互动JavaScript继承完全缺乏设计指导等所以他认为JavaScript仍然较差
最近我和许多程序员一样对JavaScript进行重新探讨事实上JavaScript是一个非常有能力的语言但使用新JavaScript一年后我得出的结论却是JavaScript仍然很烂我并不是在讨论其古怪的比较运算而是从更深的层次去思考与此同时还会提供一些解决方案供你选择
直奔主题
岁时父亲送给我第一本编程书籍JavaScript初学者编程让我兴奋的是我发现电脑并不单单是由电线和发条所组成里面的代码清晰明了我觉得我基本上理解它了实际上也差不多终究代码除了人类理性思想的形式化还能是什么?
说实话我当时希望遇到的是Java我甚至在谷歌上搜索JavaScript和Java是同一种语言吗?当然不是所以Java成为了我学习的第二门语言不过我母亲和继父不希望在家庭电脑里安装软件所以我无法安装Java编译器我清晰地记得在把代码上传到一个在线编译器之前得反复检查代码然后等待下载jar包……
我当时认为JavaScript是一个非常严肃的语言在Notepad里新建一个HTML文件然后在IE里打开就这样开始了没有类没有私有和公有方法没有final变量当时我甚至不知道什么叫过度设计但它准确地描述了我印象中的Java:
● 无需编译
● 无处不在的开发平台
● 没有高级语言特性
● 查看源文件
为什么这么伟大的语言还会讨人厌?
Adhoc地狱
下面是一些问题设计之匆忙初衷仅仅实现简单的网页互动JavaScript继承完全缺乏设计指导一切都是adhoc:
没有OOP:JavaScript确实存在基本的对象模型但几乎无人知道它是如何工作的
没有标准库从论坛上复制粘贴代码不好玩
没有模块系统不断查找下载链接和很长的源文件
缺乏语言资源没有高品质的资源(几乎没有一本像样的书籍)意味着你只能从论坛或博客上获得一些非官方的参考
既然JavaScript有这么多缺陷到底是什么让它如此流行?
复兴
JavaScript崛起的背后可能与谷歌V引擎息息相关JavaScript突然变得很快真正地快速所以人们开始硬着头皮使用它来编写Web应用程序
然而Nodejs推出了一些更吸引人的基准允许代码在客户端和服务器端重用很像Meteor和Derby因此情况开始好转
下载按钮变得更大
Nodejs kind of sort of standardized an import system
人们可以编写更好的库
优秀的资源开始出现
然而
仍然没有采用OOP
客户端和服务端的JavaScript仍然没有关联
文档甚至是高知名度项目文档也很糟糕
为什么?
我认为现代JavaScript仍然较烂的根源是其处在一个特定的社区氛围中该氛围一直强调JavaScript是一门非常好的语言但却一直被人误解不JavaScript只是一个提早诞生且没有先例可循的语言停止包庇并且开始把JavaScript作为一个平台去拥抱作为一个编译目标
文档
人们可以尽情嘲笑Java但当我看Java文档时我可以非常明确地知道哪个对象可以创建每个方法里的参数需要抛出的异常等最好的事情莫过于使用JavaScript库作为精选示例代码这几乎是不可能写出正确的软件除非你阅读库源码甚至连如此完整的JavaScript项目Express也存在令人生厌的API文档(Ember他们那些非常优秀的API文档可能是反例)
语法糖
JavaScript社区很快就抛弃了语法糖语法糖是极富创造力的将重复逻辑代码抽象出来可以通用帮助程序员以更好的方式编写代码
● 让代码更加简洁
● 有助于表达代码背后的意思而不是算法我已经知道了数组迭代算法好吧谢谢你但是请你不要告诉我这些我只想知道你要做的东西
作为一名编码人员你的主要观众不是电脑而是其他程序员也包括将来的自己书写冗长的for循环很爽但说实话for (var i=; i<arrlength; i++)与for e in arr 比起来人们更愿意读后者顺便说一下这里的JavaScript版的循环比CoffeeScript速率要慢你知道为什么吗?
JSLint
如果程序员使用JavaScript尚未感到痛苦那JSLint成功做到了这点而且非常成功! 想象一下在某个编码的新兵训练营里想要对JavaScript进行尴尬的惩罚然后在其身上进行拔毛这好比是拿着牙刷在刷厕所事实上我宁愿从牦牛身上拔毛这是原文中的例子小编的理解是JSLint的出现是给JavaScript挑刺的而这样还不如直接在JavaScript身上拔毛
更值得注意地是作为程序员我们应该寻找自动化难道你不希望自己可以自动化JSLint吗?当然你可以CoffeeScript可以完美的生成linted代码正如Jeremy
OOP
JavaScript对象模型还是不够成熟原型(Prototype)继承是一个低级别的功能可以创建一些非常有意义的对象模型但却无法基于本身进行构建
这也可能是JavaScript API为什么会那么糟糕的原因当你所使用的语言甚至没有类时该如何记录面向对象代码呢? 最重要的是当我们甚至不知道实例化对象时JavaScript开发人员该如何实行互操作?
有什么可选项吗?
年复一年笔记本逐步成为主流政坛也发生了不少的变化而JavaScript仍然保持不变你愿意等一些基本特性多少年?在这篇悲观论调的文章里让我们先看看下面这个列表
Mozilla发布了自己JavaScript或前者是在年半之前发布的且不向后兼容但并无人使用且永远不会有同样也适用于后者
ECMAScript Harmony最近由于设计委员会的原因发布新版ECMAScript将会有一个极其缓慢和痛苦的过渡过程特别是它有一些特效是与JavaScript不兼容的没有解决方案除非你愿意再等数十年
下面列出一些可选项
CoffeeScript语法非常漂亮且支持类我认为CoffeeScript并未结束只不过是刚刚华丽地开启
TypeScript一种编译到JavaScript的语言可以在JavaScript中构建并且添加了静态类型个人而言我是它的大粉丝正如Mohamed Mansour和Dave Hodder在评论中指出的那样TypeScript正在进一步实施ECMAScript的一些建议也许ECMAScript最终会从TypeScript中借鑒可选的静态类型
Google Dart一个全新的语言附带JavaScript编译器和一些JavaScript互操作但整体上并未整合到JavaScript生态系统中
HaXe这是一个高级语言可以编译JavaScriptFlashNekoVMPHPC++C#和Java(不久后)虽然我从未使用过但它真的令人印象深刻
总结
最后我敢押注最终的获胜者肯定是编译为JavaScript的语言虽然我们还没真正准备好这样的过渡但是所取得的进展仍是有目共睹的尽管也存在些偏离但他们正在替未来的Web发展铺平道路不管最终哪门语言会胜出我都想强调一下我的主要观点JavaScript目前仍然存在许多不足我们需要拥抱一个新语言并且推进它