# 前言

在前端的面试中,我们也会遇见面试官问我们这个面试题,今天就把它们两个和大家一起探究一下。

# MDN中给出的定义

null:是一个字面量,特指对象值未设置。null是表示缺少标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。

undefined:是全局对象的一个属性,undefined的最初始值就是原始数据类型 undefined。

# 相同点

  1. 都是JavaScript的基本类型之一
  2. 变量赋值时都是保存在栈中
  3. 在布尔运算中被认为是 falsy
  4. 在非严格判断下两者是相等的

# 不同点

# typeof

使用 typeof 判断两者类型,类型不同

typeof null // 'object'

typeof undefined // 'undefined'

// 更精确的判断类型
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'

# == 和 ===

// 在非全等判断下,两者相等
null == undefined // true

// 在全等判断下,两者不等
null === undefined // false

// 取反判断,两者相等,因为转换为布尔值,两个都是 false
!!null === !!undefined

# + 运算表现不同

const n1 = undefined + 1 // NaN
const n2 = null + 1 // 1

因为存在隐私转换
Number(null) -> 0
Number(undefined) -> NaN

# JSON.stringify 表现不同

JSON.stringify({ a: undefined }) // '{}'

JSON.stringify({ a: null }) // '{"a":null}'JSON序列化中,属性值是 undefined 会被过滤掉。

# 为什么 typeof null 是 object?

typeof null 输出 'object' 其实是底层的错误,一直到现在都没有被修复。

原因是,在 JavaScript 初始版本中,值以32位存储。前3位表示数据类型的标记,其余位则是值。 对于所有的对象,它的前3位都是以000作为类型标记位。而null的二进制表示全是0,自然前3位也是0,所以执行typeof时会返回'object'

数据类型 机器码标识
对象 000
整数 1
浮点数 010
字符串 100
布尔值 110
null 全为0