相信许多初学 javascript 都会有这种想法: 为什么 javascript 有 null 又有 undefined ,相对 C , C++ ,Java ,他们都是只有 null 而已,为什么 javascript 就不同
一、历史原因
通过网络搜索得知,1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。根据C语言的传统,null被设计成可以自动转为0。
但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示"无"的值最好不是对象。
其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。
二、相似性
现实中我们运用得到 null 和 undefined ,发现两者具有很强的相似性
1 var a = null; 2 var a = undefined;
以上两个变量赋值,老实说,基本上他们是没多大区别。
我们来看以下代码:
var a = null ; var b = undefined; console.log(a == b); // true
在运算符运算中,两者是等值的,事实上,在if语句判断中 null 和undefined 都会默认为false;那么既然两者含义和用法都如此相似,那么为什么还要设置个undefined 呢? 别着急,我们接下来继续看一段代码:
1 var a = null ; 2 var b = undefined; 3 console.log(typeof(a)); 4 console.log(typeof(b)); 5 // object 6 // undefined
从代码中可以看出,a b 赋值 null,undefined 后,通过类型判断得知,a 是一个对象,b 则还是undefined;
目前 null 和 undefined 只有一部分细微的差别 :
null 表示“没有对象”,典型用法是:
(1) 用于函数传参,表示函数 参数为一个空对象; (2) 作为 函数原型链终点;
Object.getPrototypeOf(Object.prototype) // null
undefined 表示 “缺少值”,典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
1 var i; 2 i // undefined 3 4 function f(x){console.log(x)} 5 f() // undefined 6 7 var o = new Object(); 8 o.p // undefined 9 10 var x = f(); 11 x // undefined
看完 null undefined ,我们再来看看 NaN,还是先看一段代码:
1 var a = null ; 2 var b = undefined; 3 var c = NaN; 4 console.log(a==c); 5 console.log(b==c); 6 console.log(typeof(c)); // false // false // number
从代码看出 NaN 既不是 null, 也不是 undefined,而是一个数字,一个特殊的数字,为什么说是一个特殊的数字呢?
1 var c = NaN; 2 var d="hello world"; 3 console.log(isNaN(d)); 4 console.log(c==NaN); // true // false
从以上得知,NaN 不等于自己, 那么它是用来表示什么的, W3C 的说法是 NaN 属性用于引用特殊的非数字值, 所以 NaN 常用判断 是否为 一个非数字类型,
无法使用 for/in 循环来枚举 NaN 属性,也不能用 delete 运算符来删除它。NaN 不是常量,可以把它设置为其他值。