null和undefined

大多数计算机语言,有且仅有一个表示“无”的值,比如,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 ,也是针对这个语义的理解。

参考

你可能感兴趣的:(null和undefined)