# 前言
在前端的面试中,我们也会遇见面试官问我们这个面试题,今天就把它们两个和大家一起探究一下。
# MDN中给出的定义
null:是一个字面量,特指对象值未设置。null是表示缺少标识,指示变量未指向任何对象。把 null 作为尚未创建的对象,也许更好理解。
undefined:是全局对象的一个属性,undefined的最初始值就是原始数据类型 undefined。
# 相同点
- 都是
JavaScript的基本类型之一 - 变量赋值时都是保存在栈中
- 在布尔运算中被认为是
falsy - 在非严格判断下两者是相等的
# 不同点
# 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 |