龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

JavaScript与生俱来的10个设计缺陷(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
6. 加号运算符 +号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。 alert(1+10); //11 alert( "1" + "10" ); //110 如果一个操作项

6. 加号运算符

+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。

  1. alert(1+10); // 11  
  2. alert("1"+"10"); // 110 

如果一个操作项是字符,另一个操作项是数字,则数字自动转化为字符。

  1. alert(1+"10"); // 110  
  2. alert("10"+1); // 101 

这样的设计,不必要地加剧了运算的复杂性,完全可以另行设置一个字符连接的运算符。

7. NaN

NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:

  1. NaN === NaN; //false  
  2. NaN !== NaN; //true  
  3. alert( 1 + NaN ); // NaN 

与其设计NaN,不如解释器直接报错,反而有利于简化程序。

8. 数组和对象的区分

由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。Douglas Crockford的代码是这样的:

  1. if ( arr &&   
  2. typeof arr === 'object' &&  
  3. typeof arr.length === 'number' &&  
  4. !arr.propertyIsEnumerable('length')){  
  5. alert("arr is an array");  

9. == 和 ===

==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。

  1.  "" == "0" // false  
  2. 0 == "" // true  
  3. 0 == "0" // true  
  4. false == "false" // false  
  5. false == "0" // true  
  6. false == undefined // false  
  7. false == null // false  
  8. null == undefined // true  
  9. " trn" == 0 // true 

因此,推荐任何时候都使用"==="(精确判断)比较符。

10. 基本类型的包装对象

Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。

  1. new Boolean(false);  
  2. new Number(1234);  
  3. new String("Hello World"); 

与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。

  1. alert( typeof 1234); // number  
  2. 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

  1. JavaScript面向对象编程深入分析
  2. 向Brendan致敬-那段华丽的JavaScript历史
  3. 一位反JavaScript主义者的觉醒
  4. JavaScript诞生记:C语言和Self语言一夜情的产物
  5. JavaScript网页开发指南
精彩图集

赞助商链接