undefined与null
1.Undefined
Undefined 类型只有一个值,即undefined。在使用var 声明变量但未对其初始化时,这个变量的值就是undefined。例如:
var word;
console.log(word == undefined); //true
这个例子只声明了变量,但未对其进行初始化。比较这个变量与undefined 字面量,结果表明它们是相等的。
不过,包含undefined 值的变量与尚未定义的变量还是不一样的。看看下面这个例子:
var message; // 这个变量声明之后默认取得了undefined 值
// var hello; //这个变量并没有声明
console.log(word); // "undefined"
console.log(hello); // 产生错误
运行以上代码,第一个控制台会输出变量word的值,即"undefined"。而第二个输出——由于传递给console.log()函数的是尚未声明的变量hello——则会导致一个错误。
然而,对未初始化的变量执行typeof 操作符会返回undefined 值,而对未声明的变量执行typeof 操作符同样也会返回undefined 值。
例如:
var word; // 这个变量声明之后默认取得了undefined 值
// var hello; // 这个变量并没有声明
console.log(typeof word); // "undefined"
console.log(typeof hello); // "undefined"
2.Null
Null 类型也只有一个值的数据类型,这个值是null。从逻辑角度来看,null 值表示指向一个空对象,而这也正是使用typeof 操作符检测null 值时会返回"object"的原因,如下面的例子所示:
var car = null;
console.log(typeof car); // "object"
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null 而不是其他值。这样一来,只要直接检查null 值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:
if (car != null){ // 对car 对象执行某些操作
}
alert(null == undefined); //true
3.Null与Undefined的区别
这里,null = undefined 总是返回true,不过要注意的是,这个操作符出于比较的目的引擎会隐式转换,实际上,undefined 值是派生自null 值的①。
即使null == undefined 为true,但它们是两种完全不同的数据类型,同时它们的作用也不尽相同。我们没有必要为一个变量设置为undefined,但是很多情形下我们会对个一个变量赋值为null,表示为空。即意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null 值。这样做不仅可以体现null 作为引用空对象习惯,也区分null 和undefined。
①.ECMA-262 规定对它们的相等性测试要返回true 。