JavaScript基础——null 和 undefined

564 阅读3分钟

最近在看面经被一道题问住了 null == undefined 为什么值为 true?而null === undefined 为什么值为 false?(承认自己很垃圾) 在这里也想对有关 nullundefined 的知识做一下整理。

在 JavaScript 中有两个表示“无”的值。

undefined

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

  1. 声明的变量未赋值
var a
console.log(a)  // undefined
  1. 引用对象中不存在的属性
console.log(Object.a); // undefined
  1. 函数定义了形参,但没有传递实参
//函数定义了形参 a
function fn(a) {
    console.log(a); //undefined
}
fn(); //未传递实参
  1. 使用 void 对表达式求值
void 0 ; // undefined
void false; //undefined
void []; //undefined
void null; //undefined
void function fn(){} ; //undefined

ECMAScript 规范 void 操作符 对任何表达式求值都返回 undefined ,这个和函数执行操作后没有返回值的作用是一样的,JavaScript中的函数都有返回值,当没有 return 操作时,就默认返回一个原始的状态值,这个值就是undefined,表明函数的返回值未被定义。

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

null

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

当一个对象被赋值了null 以后,原来的对象在内存中就处于游离状态(空指针),GC 会择机回收该对象并释放内存。因此,如果需要释放某个对象,就将变量设置为null,即表示该对象已经被清空,目前无效状态。试想一下,如果此处把 null 换成 undefined 会不会感到别扭? 显然语义不通,其操作不能正确的表达其想要的行为。

typeof null 结果是 ”object“

补充说明:

typeof null == 'object'     // true

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

null == undeifined

ECMAScript 规范认为:要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。

null 和 undefined都代表着无效的值。,所以 ==true

null === undeifined

全等于状态下,是false,这个很好理解了。它们不属于同一数据类型。

 typeof null        //object
 typeof undefined       //undefined

总结

  • 简单来说:

null表示"没有对象",即该处不应该有值。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。

  • 用一句话总结两者的区别就是:

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