javascript本身是弱类型的语言,加上它的很多很好用的特性,让我使用的时候会很方便,但是方便的同时也会带来很多很容易忽略的问题,我找了几个比较容易出问题的地方解析一下:
typeof
这个关键字应该算是运算符,它可以得到当前变量的类型:
> typeof 1.1
'number'
> typeof "sssss"
'string'
> typeof {}
'object'
那么一些特殊的变量会返回什么呢?
> typeof null
'object'
> typeof undefined
'undefined'
> typeof [1,2,3]
'object'
> typeof NaN
'number'
> typeof Infinity
'number'
各有各的返回值,所以在使用这个运算符的时候一定要很小心,如果想判断一个变量是否为空(null, undefined),直接用!object即可。
parseInt
有人会问parseInt不就是一个字符串转数字的方法吗,它有啥问题呢?
我们举个例子看看:
> parseInt('89abc')
89
> parseInt('abc')
NaN
额,很奇怪吧,第一个例子明明是一个异常的字符串,为什么parseInt之后还是出结果呢,那是因为parse是这样的,它会找到数字去转换成整数,直到遇到非数字后就不再解析,直接返回已经解析的数字,如果从开始到最后都没有找到数字,就会返回NaN。
所以说这个方法用的时候还是小心点吧。
+
这个"+"运算符是做加法和字符串拼接用的,前后两个变量如果都是数字,就会进行加法运算,如果有一个是字符串,就会进行字符串拼接,由于javascript是弱类型语言,所以这个"+"的使用也是要非常小心才行。
> 1 + 2
3
> '1' + 2
'12'
浮点数
和c/c++一样,浮点数不能很正确的处理浮点数,比如 0.1 + .02 不会等于0.3,我们看看例子:
> 0.2+0.1 == 0.3
false
那为什么呢?我们看看加之后的值:
> 0.2+0.1
0.30000000000000004
> 0.3+0.1
0.4
> 0.4+0.1
0.5
> 0.5+0.1
0.6
> 0.6+0.1
0.7
> 0.7+0.1
0.7999999999999999
是吧,这个值是不确定的,不一定能和我们真实的结果做对比,这个地方使用的时候也要小心点了。
===、!== 和==、!=
在我们使用javascript的时候,尽量使用===和!==,不要去使用==和!=什么原因呢?我们看看答案:
> '' == '0'
false
> 0 == ''
true
> 0 == '0'
true
> false == 'false'
false
> false == '0'
true
> false == undefined
false
> false == null
false
> null == undefined
true
> '\n' == 0
true
为什么明明不同,却也能返回true呢?那是因为==和!=会对两边的变量的类型做转换,转换为可以真正对比的类型,那就有可能会返回true。
eval
eval会传递一个字符串给javascript编译器,并执行,有些时候这个特性会让我们解决一些要走很多弯路的问题,但是如果滥用会导致代码很难看,并且让性能急剧下降。毕竟你给个字符串到编译器,编译器要重新编译执行的。
continue
少用它吧,毕竟会影响性能。