首先 undefined
和 null
都是基本数据类型。
undefined
的字面意思就是:未定义的值 。
这个值的语义是,希望表示一个变量最原始的状态,而非人为操作的结果。这种原始状态会在以下 4
种场景中出现:
void
对表达式求值因此,undefined
一般都来自于某个表达式最原始的状态值,不是人为操作的结果。当然,你也可以手动给一个变量赋值 undefined
,但这样做没有意义,因为一个变量不赋值就是 undefined
。
null
的字面意思是:空值 。这个值的语义是,希望表示一个对象被人为的重置为空对象,而非一个变量最原始的状态 。 在内存里的表示就是,栈中的变量没有指向堆中的内存对象。
与 null
相关的另外一个问题需要解释一下:
jstypeof null == 'object'
null
有属于自己的类型 Null
,而不属于 Object
类型,typeof
之所以会判定为 Object
类型,是因为 JavaScript
数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0
会被 typeof
判断为对象类型,而 null
的二进制位恰好都是 0
,因此,null
被误判断为 Object
类型。
其实,我们可以通过另一种方法获取 null
的真实类型:
jsObject.prototype.toString.call(null) ; // [object Null]
通过 Object
原型上的 toString()
方法可以获取到 JavaScript
中对象的真实数据类型,当然 undefined
类型也可以通过这种方式来获取:
jsObject.prototype.toString.call(undefined) ; // [object Undefined]
相似性
虽然 undefined
和 null
的语义和场景不同,但总而言之,它们都表示的是一个无效的值。 因此,在JS
中对这类值访问属性时,都会得到异常的结果:
jsnull.toString(); // Cannot read property 'toString' of null
undefined.toString(); // Cannot read property 'toString' of undefined
ECMAScript
规范认为,既然 null
和 undefined
的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有
jsundefined == null; // true
不要试图通过转换数据类型来解释这个结论,因为:
jsNumber(null); // 0
Number(undefined); // NaN
在比较相等性之前,null
没有被转换为其他类型
jsnull == 0 ; //false
但 ===
会返回 false
,因为全等操作 ===
在比较相等性的时候,不会主动转换分项的数据类型,而两者又不属于同一种类型:
jsundefined === null; // false,类型不相同
undefined !== null; // true, 类型不相同
用一句话总结两者的区别就是:undefined
表示一个变量自然的、最原始的状态值,而 null
则表示一个变量被人为的设置为空对象,而不是原始状态。所以,在实际使用过程中,为了保证变量所代表的语义,不要对一个变量显式的赋值 undefined
,当需要释放一个对象时,直接赋值为 null
即可。
`
本文作者:叶继伟
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!