最近,我和许多程序员一样,对JavaScript进行重新探讨。事实上,JavaScript是一个非常有能力的语言,但使用新JavaScript一年后,我得出的结论却是JavaScript仍然很烂。我并不是在讨论其古怪的比较运算。而是从更深的层次去思考。与此同时,还会提供一些解决方案供你选择。
直奔主题
13岁时,父亲送给我第一本编程书籍——JavaScript初学者编程。让我兴奋的是,我发现电脑并不单单是由电线和发条所组成,里面的代码清晰明了。我觉得我基本上理解它了,实际上也差不多。终究,代码除了人类理性思想的形式化还能是什么?
说实话,我当时希望遇到的是Java,我甚至在谷歌上搜索:“JavaScript和Java是同一种语言吗?”当然不是。所以Java成为了我学习的第二门语言,不过我母亲和继父不希望在家庭电脑里安装软件,所以我无法安装Java编译器。我清晰地记得,在把代码上传到一个在线编译器之前,得反复检查代码,然后等待、下载jar包……
我当时认为,JavaScript是一个非常严肃的语言。在Notepad里新建一个HTML文件,然后在IE里打开,就这样开始了。没有类、没有私有和公有方法,没有final变量。当时,我甚至不知道什么叫“过度设计”,但它准确地描述了我印象中的Java:
- 无需编译
- 无处不在的开发平台
- 没有高级语言特性
- 查看源文件
为什么这么伟大的语言还会讨人厌?
Ad-hoc地狱
下面是一些问题:设计之匆忙、初衷仅仅实现简单的网页互动、JavaScript继承完全缺乏设计指导,一切都是ad-hoc:
- 没有OOP:JavaScript确实存在基本的对象模型,但几乎无人知道它是如何工作的。
- 没有标准库:从论坛上复制粘贴代码不好玩。
- 没有模块系统:不断查找下载链接和很长的源文件。
- 缺乏语言资源:没有高品质的资源(几乎没有一本像样的书籍)意味着你只能从论坛或博客上获得一些非官方的参考。
既然JavaScript有这么多缺陷,到底是什么让它如此流行?
复兴
JavaScript崛起的背后可能与谷歌V8引擎息息相关。JavaScript突然变得很快,真正地快速。所以人们开始硬着头皮使用它来编写Web应用程序。
然而,Node.js推出了一些更吸引人的基准,允许代码在客户端和服务器端重用,很像Meteor和Derby。因此,情况开始好转:
- 下载按钮变得更大
- Node.js 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=0; i<arr.length; 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发布了自己JavaScript1.7或1.8,前者是在6年半之前发布的,且不向后兼容,但并无人使用且永远不会有,同样也适用于后者。
- ECMAScript Harmony。最近,由于设计委员会的原因,发布新版ECMAScript将会有一个极其缓慢和痛苦的过渡过程,特别是它有一些特效是与JavaScript不兼容的。没有解决方案,除非你愿意再等数十年。
下面列出一些可选项
- CoffeeScript语法非常漂亮且支持类。我认为CoffeeScript并未结束,只不过是刚刚华丽地开启。
- TypeScript一种编译到JavaScript的语言,可以在JavaScript中构建并且添加了静态类型。个人而言,我是它的大粉丝。正如Mohamed Mansour和Dave Hodder在评论中指出的那样,TypeScript正在进一步实施ECMAScript的一些建议,也许ECMAScript最终会从TypeScript中借鉴可选的静态类型。
- Google Dart一个全新的语言,附带JavaScript编译器和一些JavaScript互操作,但整体上并未整合到JavaScript生态系统中。
- HaXe这是一个高级语言,可以编译JavaScript、Flash、NekoVM、PHP、C++、C#和Java(不久后),虽然我从未使用过,但它真的令人印象深刻。
总结
***,我敢押注,最终的获胜者肯定是编译为JavaScript的语言。虽然我们还没真正准备好这样的过渡,但是所取得的进展仍是有目共睹的。尽管也存在些偏离,但他们正在替未来的Web发展铺平道路。不管最终哪门语言会胜出,我都想强调一下我的主要观点:JavaScript目前仍然存在许多不足,我们需要拥抱一个新语言并且推进它。