大多数计算机语言,有且仅有一个表示“无”的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil。
JavaScript有些特殊,有两个表示“无”的值:null和undefined。
区别:
-
null表示“没有对象”,即该处不应该有值。典型用法:
(1)作为函数的参数,表示该函数的参数不是对象;
(2)作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype) // null
-
undifined表示“缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值是,就等于undefiend;
(2)调用函数时,应该提供的参数没有提供,该参数等于undefined;
(3)对象没有赋值的属性,该属性的值为undefined;
(4)函数没有返回值是,默认返回undefined。
var i;
i; // undefined
function f(x) { console.log(x) }
f(); // undefined
var o = new Object();
o.p; // undefined
var x = f();
x ; // undefined
Ps: null 转为数值时为0;undefined 转为数值时为NaN;
相似处
- undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。
if (!undefined) console.log("undefined is false"); // undefined is false
if (!null) console.log("null is false"); // null is false
undefined == null // true
延伸
上述的区别:null表示一个值被定义了,定义为“空值”;undefined表示根本不存在定义。
因此设置一个值为null是合理的,如 objA.valueA = null;
但设置一个值为undefined是不合理的,如objA.valueA = undefined; // 应该直接使用delete objA.valueA; 任何一个存在引用的变量值为undefined都是一件错误的事情。
这样判断一个值是否存在,就可以用objA.valueA === undefined; // 不应该使用null,因为undefined == null,而null表示该值定义为空值
Ps: 这个语义在JSON规范中被强化,这个标准中不存在 undefined 这个类型,但存在表示空值的 null 。在一些使用广泛的库(比如jQuery)中的深度拷贝函数会忽略 undefined 而不会忽略 null ,也是针对这个语义的理解。