目录

1. undefined
2. null
3. 总结

首先 undefinednull 都是基本数据类型

1. undefined

undefined 的字面意思就是:未定义的值

这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果。这种原始状态会在以下 4 种场景中出现:

  1. 声明了一个变量,但没有赋值
  2. 访问对象上不存在的属性
  3. 函数定义了形参,但没有传递实参
  4. 使用 void 对表达式求值

因此,undefined 一般都来自于某个表达式最原始的状态值,不是人为操作的结果。当然,你也可以手动给一个变量赋值 undefined,但这样做没有意义,因为一个变量不赋值就是 undefined

2. null

null 的字面意思是:空值 。这个值的语义是,希望表示一个对象被人为的重置为空对象,而非一个变量最原始的状态 。 在内存里的表示就是,栈中的变量没有指向堆中的内存对象。

null 相关的另外一个问题需要解释一下:

js
typeof null == 'object'

null 有属于自己的类型 Null,而不属于 Object 类型,typeof 之所以会判定为 Object 类型,是因为 JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。

其实,我们可以通过另一种方法获取 null 的真实类型:

js
Object.prototype.toString.call(null) ; // [object Null]

通过 Object 原型上的 toString() 方法可以获取到 JavaScript 中对象的真实数据类型,当然 undefined 类型也可以通过这种方式来获取:

js
Object.prototype.toString.call(undefined) ; // [object Undefined]

相似性

虽然 undefinednull 的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS 中对这类值访问属性时,都会得到异常的结果:

js
null.toString(); // Cannot read property 'toString' of null undefined.toString(); // Cannot read property 'toString' of undefined 

ECMAScript 规范认为,既然 nullundefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有

js
undefined == null; // true

不要试图通过转换数据类型来解释这个结论,因为:

js
Number(null); // 0 Number(undefined); // NaN

在比较相等性之前,null 没有被转换为其他类型

js
null == 0 ; //false

=== 会返回 false ,因为全等操作 === 在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型:

js
undefined === null; // false,类型不相同 undefined !== null; // true, 类型不相同

3. 总结

用一句话总结两者的区别就是:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。

`

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:叶继伟

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!