JavaScript中null和undefined详解

一. 使用场景

  1. 在非严格场景下, 二者值是相等的
let a = null;
let b = undefined;
console.log(a == b) // true
console.log(a === b) // false
复制代码
  1. 在条件判断表达式中,二者做用也是相等的
if (null) {
    console.log('null', null)
} else {
    console.log('!null', !null) // 此项会输出 !null true
}
if (undefined) {
    console.log('undefined', undefined)
} else {
    console.log('!undefined', !undefined) // 此项会输出 !undefined true
}
复制代码
  1. 对null和undefind进行数值类型强制类型转换
console.log(Number(null));    // 0
console.log(Number(undefined)); // NaN 
复制代码

为什么二者获得的结果不同呢?很显然,二者是彻底不一样的两种类型javascript

console.log(typeof null) // object
console.log(typeof undefined) // undefined
复制代码

能够看到null 是Object类型,undefined 是Undefined类型,看到这里我不由有了一个疑问,若是null是引用数据类型,那么我在MDN上看到的null则是基本数据类型,是MDN写错了?java

  答案应该没有这么简单。 引用“在 javascript 的最第一版本中,使用的 32 位系统,而且底层都表示为2进制,为了性能考虑使用低位存储了变量的类型信息:000:对象1:整数010:浮点数100:字符串110:布尔所有为0: null,因此typeof就是利用这一机制去判断的,因此null所有为0就复合了对象的000,因此被判断为objectbash

因此使用typeof判断变量类型的方式并不许确。post

console.log(Object.prototype.toString.call(null))  // [object Null]
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
复制代码

因此null依然是基本数据类型Null, undefined也是基本数据类型Undefined性能

二. 那么JS为什么会有两个使人困惑的类型呢?

  首先咱们须要先了解一个null值是什么?MDN上是这样描述的:In computer science, a null value represents a reference that points, generally intentionally, to a nonexistent or invalid object or address. The meaning of a null reference varies among language implementations. 翻译过来就是: 在计算机科学中,一个null值表明一个指针的引用,一般来指一个不存在的或者无效的对象或者地址。空引用的含义因语言实现而异。
  在1995年JavaScript诞生的时候,只设置了null值,并被设计为能够自动转为0。null表示为空对象的引用,因为JavaScript数据类型分为基本数据类型和引用数据类型,因此JavaScript的设计者Brendan Eich认为最好不要用null表示基本数据类型变量未初始化时的值,因此后来又定义了undefined来表示基本数据类型未初始化时的值。ui

相关文章
相关标签/搜索