日期:2014-05-16  浏览次数:20442 次

易让人忽视的JAVASCRIPT陷阱

parseInt
parseInt是将字符串转换为整数的函数,这个函数有个基模式参数,该参数默认是10,即以将字符串转换为十进制的整数。当字符串以0开头时,JavaScript会八进制方式求值。

PLAIN TEXT
JAVASCRIPT:
var s = '08';
parseInt(s); //0
parseInt(s, 10); //8
上面的代码中,第二行是忽略了基模式参数,当遇上字符串08时,JavaScript会用八进制方式来求值,而8在八进制中不是一个有效数字,所以求值结果是0。第三行是为parseInt指定了基模式是10,所以按着十进制方式求值后,结果为8,该结果正确。所以在使用parseInt时带上基模式参数是一个好习惯。

?

typeof
typeof是返回一个用来表示表达式的数据类型的字符串。下面几种情况返回的类型值是错误的:

PLAIN TEXT
JAVASCRIPT:
typeof null; //object, not null
上面的代码中,检查null的类型返回object,而并非null。

PLAIN TEXT
JAVASCRIPT:
var a = new String('Hello');
typeof a; //object, not string
上面的代码中,检查字符串Hello的类型返回object,而并非string。对于Boolean、Number等简单数据类型也存在同样的错误。解决方法是封装自己的类型检查函数:

function isString(object) {
??? return Object.prototype.toString.call(object) == "[object String]";
}
var a = new String('Hello');
isString(a); //true

?


NaN
表示算术表达式返回非数字值的特殊值。NaN 不与任何值相等,包括其本身。

PLAIN TEXT
JAVASCRIPT:
NaN === NaN; //false
typeof NaN; //number
isNaN(NaN); //true
上面的代码中,第一行验证了NaN不与任何值相等。第二行与第三行有点矛盾,第二行显示NaN的类型为number,第三行却实现NaN不是一个数字类型的值,因此还是封装一个数字类型的检查函数保险。

function isNumber(object) {
??? return Object.prototype.toString.call(object) == "[object Number]";
}

?


隐形Boolean转换
在流程控制的条件中,如果条件变量不是布尔类型值,JavaScript会对条件变量做隐性:'',NaN,null,undefined,0这几个转换为false,其他值都转换为true。特别需要注意的是,只有空字符串转换为false,其他非空字符串都会转换为true,这里尤其要小心的是'0',它也被认为是true(因为它非空嘛)。

?

?

比较大小
编程时经常会在条件判断中比较两个数值的大小,当被比较的两个变量都是数值类型时,不会产生问题,假如双方为字符串类型时,比较就可能产生问题了。

PLAIN TEXT
JAVASCRIPT:
'10'>'2' //false
上面的代码返回false,原因比较两个字符串是根据字符本身的ASCII码的大小,从左往右进行比较。'1'的ASCII码是49,'2'的ASCII码是50,所以'10'小于'2'。为了避免字符串比较带来的问题,比较前最好确保所比较的变量都是数值类型(至少保证一方为数值,在比较时会先将另一方隐性转换为数值类型,再做比较)。