undefined 和 null

# undefined 和 null

JavaScript 中的基本数据类型包括:

String、Number、Boolean、null、undefined、BigInt,

其中 null 和 undefined 都表示“无”这层含义,一般情况下,两者几乎没有区别。

# 相似之处

# 可以进行赋值

在全局定义两个变量,一个是 null,另一个是 undefined,最终他们都被挂载到全局对象上了,且值都为 undefined:

var a = null;
var b = undefined;
console.log(global.a, global.b); // undefined undefined。这说明,null不是全局对象的一个属性。

# 类型转换

在 if 语句中,null 和 undefined 都会被认为是 false:

var a = null;
var b = undefined;

if (!a) {
  console.log(a); // null
}

if (!b) {
  console.log(b); // undefined
}

也就是说,在具有类型转换的场景中,null 和 undefined 都会被转化为 false:

console.log(!!null); // false
console.log(!!undefined); // false

# ==判断为 true

如下代码,用==判断 null 和 undefined,结果为 true,这是因为它们都被转化为了布尔值的 false,这是因为它们都表示无效的值,所以 ECMA 规范规定了 null 和 undefined 是相等的,并不能用转换数据类型来解释。

console.log(null == undefined); // true

# ===判断为 false

而使用===判断时,由于它们属于不同的数据类型,则直接会返回 false:

console.log(null === undefined); // false

# 不同之处

# null

null 表示一个值被定义了,但定义的是空值。

以下是 null 的经典用法。

(1)作为函数的参数,表示不传入此参数。

const test = (a, b) => {
  console.log(b);
};

test(null, 2); // 2

(2)作为原型链的终点。

console.log(Object.prototype.__proto__); // null

# undefined

undefined 表示根本不存在定义。

以下是 undefined 的经典用法。

(1)变量被声明,但还没有赋值,此时的变量等于 undefined。

let a;
console.log(a); // undefined

(2)调用函数时,应该传入的参数未传入,则该参数为 undefined。

const test = (a) => {
  console.log(a);
};

test(); // undefined

(3)对象没有定义的属性,该属性为 undefined。

const obj = {};

console.log(obj.a); // undefined

// 注意,在未定义的属性上,继续读取属性会报错
console.log(obj.a.b); // TypeError: Cannot read property 'b' of undefined

(4)不在数组索引范围的值,为 undefined。

const arr = [1];

console.log(arr[100]); // undefined

(5)函数没有返回值时,默认返回的是 undefined。

const test = () => {};

console.log(test()); // undefined

# 感谢巨人:

  1. 飞鸟-JS 空值区别 (opens new window)