[TOC] #### 1. 前言 --- null 和 undefined 的区别 ?这是一道基础面试题 很多人都会说 null 是空,undefined 是未定义,这样回答太过于笼统。 面试官反问:null 是空代表没有值是吧,undefined 是未定义也是没有值是吧,都是没有值,它们的区别到底是什么 ? 应聘者:这下芭比Q了 ! #### 2. 历史原因 --- JavaScript 语言居然有两个表示 “无” 的值:null、undefined,这是为什么 ? 1995 年 JS 诞生时,最初像 Java 一样,只设置了 null 作为表示 “无”,根据 C 语言的传统,null 被设计成可以自动转为 0 但是,JS 的设计者,觉得这样做还不够,主要有下面两个原因 一、JS 中的 null 像 Java 中的 null 一样,被当作一个对象。但是 JS 中的数据类型分为 **原始类型 和 合成类型(复合类型)**,作者觉得表示 “无” 的值最好不是对象,也可以理解为不应该是对象 ```javascript // 返回值是 object typeof null ``` 二、JS 的最初版本没有错误处理机制,发生数据类型不匹配时,会自动进行类型转换,作者觉得,如果 null 自动转为 0,很不容易发现错误 ```javascript // 2 null + 2 // NaN undefined + 2 ``` 因此,作者又设计了一个 undefined。先有 null 后有 undefined,出来 undefined 是为填充之前的坑 #### 3. 具体区别 --- **a. 自动转换** JS 最初版本是这样区分的: null 表示一个 “无” 的对象(空对象指针),转为数值时是 0,undefined 表示一个 “无” 的原始值,转为数值时是 NaN **b. 含义不同** null 的含义是空对象。一般用于赋值给那些可能返回对象的变量作为初始化值。typeof null 的返回值是 object undefined 的含义是未定义。变量声明了但没有赋值,变量的值是 undefined。typeof undefined 的返回值是 undefined