首先要了解JS判断语句中的假值
值 类型
0 Number
NaN Number
‘’(空字符串) String
false Boolean
null Object
undefined Undefined
怎么辨别数组,null和对象
typeof
typeof不能判断出数组和null,而且对于通过new操作符生成的对象,只会返回’object’
1 | alert(typeof null); //'object' |
但Object.prototype.toString对任何变量会永远返回这样一个字符串”[object class]”,而这个class就是JavaScript内嵌对象的构造函数的名字。至于用户自定义的变量,则class等于object。
1 | alert(Object.prototype.toString.call(null)); //'[object Null]' |
①因此通过Object.prototype.toString.call(obj)可以准确的获取变量数据类型。
通过Object.prototype.toString可以获得的数据类型包括:Date, Object, String, Number, Boolean, Regexp, Function, undefined, null等。
②因为null是假值,所以辨别null与object或数组的关系可以用如下
1 | //var value=null; |
判断NaN值
NaN值一般在试图把非数字形式的字符串转换为数字时产生。
上面的typeof和Object.prototype.toString.call(obj);都不能判断NaN值,而且NaN也不等同于它自己。
1 | alert(typeof NaN); //'number' |
好在JS提供了isNaN函数,可以辨别数字与NaN
1 | alert(isNaN('0')); //false |
其它问题记录
undefined和null与任何有意义的值比较返回的都是false,但是null与undefined之间互相比较返回的是true。
一般typeof正则表达式都会返回’object’,但在Safari3.x版本中,返回的是’function’
1 | alert(undefined==null); //true |
严格相等运算符(===)有两个需要注意的例子:除了NaN===NaN返回false以外,+0===-0却返回true。所以ES6提出了Object.is()方法来比较两个值是否严格相等。