Dart,你凭什么挑战JavaScript?
?
不妨先来打量一下JavaScript。JavaScript是唯一至今主流且基于原型的语言,虽然说支持面向对象,但是无论是封装、继承、多态,实现起来总需要用到一些tricky的办法,而且也不甚完美。事实上,为了抢市场,从1995年JavaScript设计完成到发布,只有短短的7、8个月的时间,极度缺乏谨慎的语言特性和规范的评估。而和微软JScript的竞争,使得EcmaScript标准仓促问世,这些都是JavaScript存在诸多缺陷的重要因素。
不止如此,Google认定,JavaScript的缺陷难以以改良的方式被修复,必须革命。那么都有哪些缺陷呢?推荐大家去阅读《Using JavaScript as a Real Programming Language》,作者是曾经SUN公司的Tommi Mikkonen和Antero Taivalsaari。我挑选互联网上热议的几条观点说说:
-
语法过于松散。JavaScript对于错误的兼容性很好,不到迫不得已的时刻不随便抛出异常,这有时候会让问题定位变得困难。代码随意性很强,可以实现类和对象的封装效果,也可以随意放置全局变量、全局方法,命名污染、冲突和覆盖问题难以发现。还有像JSDoc等第三方组件用于提供额外的契约来帮助提升代码规范和约束性,但这样的契约并非来自语言本身,而是在注释中。另外,语法过于松散也使得性能提升变得较为困难。
-
缺乏模块化能力。有一些框架专门致力于解决这个问题(比如sea.js),但是语言本身未能从语法语义上提供import和cascade的依赖能力,也缺乏按需加载的能力(按需加载请参见Java的类加载机制)。缺乏模块化能力直接影响到大型项目的构建,我们不得不引入诸多框架和约束来保证大型项目在JavaScript部分的顺利进行。
-
核心库的不完备性。这点会在HTML5中逐步得到改善。JavaScript已经逐渐跳出客户端页面元素显示和行为的原本职工作了,现在可以做到更多的事,比如涉及网络、图像处理、声音处理、线程处理等等。不完备表现的另一方面就是常规操作的复杂性,比如对DOM的操作我们不得不借由JQuery等等JavaScript第三方库来帮助简化DOM操作和绑定的行为。
- JavaScript的编程语言范型不明确。它的编程模型和传统的C++、Java大相径庭。为何前后端的编程要分离开来,这是原因之一,也是让诸多前端工程师难受过的壁垒之一。