0%

Javascript中 undefined 与 null 的区别

undefinednull都是javascript中原始数据类型,并且ECMAScript认为undefined相等于null

1
undefined == null   // true

JavaScript最初设计null表示一个“无”的对象,转换数值是为0。undefined是一个表示”无”的原始值,转为数值时为NaN。

1
2
3
4
Number(null)    // 0
Number(undefined) // NaN

null == 0 // false

相似点

undefinednull都没有属性和方法,也不能给其他属性赋值。在if语句中都会被转换成false

1
2
null.toString() // Cannot read property 'toString' of null
undefined.toString() // Cannot read property 'toString' of undefined

区别

null

null表示没有对象,即该处不应该有值。当一个对象被赋值了null后,原来的对象在内存中处于游离状态,GC会回收该对象释放内存。

null

为什么typeof null === ‘object’ ?

因为JavaScript数据类型在底层都是以二进制的形式表示的,null的二进制为000。二进制的前三位为0会被typeof判断为对象类型。

可以通过Object.ptototype.toString.call()方法打印具体类型:

1
2
Object.prototype.toString.call(null)    // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'

常见用法:

  • 作为函数的参数,表示该函数的参数不是对象。
  • 指定垃圾收集。
  • 作为对象原型链的终点。
1
Object.getPrototypeof(Object.prototype) // null

undefined

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

常见用法:

  • 变量被声明了,但还没有赋值时,就等于undefined。
  • 调用函数时,应该提供的参数没有提供,该参数就等于undefined。
  • 对象没有赋值的属性,该属性的值为undefined。
  • 函数没有返回值时,默认返沪undefined。
  • 使用void对表达式求值。

参考