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 中的数据类型分为 原始类型 和 合成类型(复合类型),作者觉得表示 “无” 的值最好不是对象,也可以理解为不应该是对象
// 返回值是 object
typeof null
二、JS 的最初版本没有错误处理机制,发生数据类型不匹配时,会自动进行类型转换,作者觉得,如果 null 自动转为 0,很不容易发现错误
// 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