JavaScript与生俱来的10个设计缺陷(1)(2)
6. 加号运算符
+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。
- alert(1+10); // 11
- alert("1"+"10"); // 110
如果一个操作项是字符,另一个操作项是数字,则数字自动转化为字符。
- alert(1+"10"); // 110
- alert("10"+1); // 101
这样的设计,不必要地加剧了运算的复杂性,完全可以另行设置一个字符连接的运算符。
7. NaN
NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:
- NaN === NaN; //false
- NaN !== NaN; //true
- alert( 1 + NaN ); // NaN
与其设计NaN,不如解释器直接报错,反而有利于简化程序。
8. 数组和对象的区分
由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。Douglas Crockford的代码是这样的:
- if ( arr &&
- typeof arr === 'object' &&
- typeof arr.length === 'number' &&
- !arr.propertyIsEnumerable('length')){
- alert("arr is an array");
- }
9. == 和 ===
==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。
- "" == "0" // false
- 0 == "" // true
- 0 == "0" // true
- false == "false" // false
- false == "0" // true
- false == undefined // false
- false == null // false
- null == undefined // true
- " trn" == 0 // true
因此,推荐任何时候都使用"==="(精确判断)比较符。
10. 基本类型的包装对象
Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。
- new Boolean(false);
- new Number(1234);
- new String("Hello World");
与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。
- alert( typeof 1234); // number
- alert( typeof new Number(1234)); // object
关于Javascript的更多怪异行为,请参见Javascript Garden和wtfjs.com。
三、如何看待Javascript的设计缺陷?
既然Javascript有缺陷,数量还不少,那么它是不是一种很糟糕的语言?有没有前途?
回答是Javascript并不算糟糕,相反它的编程能力很强大,前途很光明。
首先,如果遵守良好的编程规范,加上第三方函数库的帮助,Javascript的这些缺陷大部分可以回避。
其次,Javascript目前是网页编程的唯一语言,只要互联网继续发展,它就必然一起发展。目前,许多新项目大大扩展了它的用途,node.js使得Javascript可以用于后端的服务器编程,coffeeScript使你可以用python和ruby的语法,撰写Javascript。
最后,只要发布新版本的语言标准(比如 ECMAscript 5),就可以弥补这些设计缺陷。当然,标准的发布和标准的实现是两回事,上述的很多缺陷也许会一直伴随到Javascript存在的最后一天。
:http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html- 上一篇:jQuery实现仿百度搜索时的下拉列表
- 下一篇:JavaScript的死与生(1)






