在JavaScript中null
与undefined
是两种基本数据类型, 都可以用来表示"无"这个概念, 但是在语义表达已经实际使用上是有所区别的
描述
大多数计算机语言只有一个用来表示"无"这个概念的值, 例如C
与C++
的NULL
、Java
与PHP
的null
、python
的None
、lua
与Ruby
的nil
, 但是在JavaScript中有null
与undefined
两种基本数据类型来表示"无"这个概念. 在很多情况下null
和undefined
几乎等价, 例如在if
语句中, 都会被 自动转为false
let _null = null;
let _undefined = undefined;
if (!_null && !_undefined) console.log("true && true"); // true & true
在==
运算符中认为null
与undefined
相等, 当然在===
运算符中认为null
与undefined
是不相等的
console.log(null == undefined); // true
console.log(null === undefined); // fasle
使用null
与undefined
来表示"无"是一个历史遗留原因, 最初设计的时候JavaScript只设置了null
作为表示"无"的值, 根据C
语言的传统, NULL
被设计成可以自动转为0
, 但是JavaScript的设计者Brendan Eich
, 觉得这样还不够, 首先最初设计JavaScript的时候认为null
是一个Object
, 这也就是typeof(null) === object
的原因, 虽然后来有过提议更改null
的类型typeof(null) === null
, 但是因为会造成大量旧JavaScript脚本出现问题而被否决了, Brendan Eich
觉得表示"无"的值最好不是对象, 且如果null
自动转为0
, 很不容易发现错误, 因此Brendan Eich
又设计了一个undefine
数据类型
虽然null
与undefined
具有非常高的相似性, 但是其在语义与实际使用中是需要有所区分的, undefined
表示不存在该值的定义, null
表示一个值被定义了, 定义为空值
, 因此设置一个值为null
是合理的, 例如obj.v = null
, 但设置一个值为undefined
是不合理的, 因为其已经被主动声明定义, 而设置为undefined
未定义是不合理的
区别
null
是一个表示"无"的对象,Number(null) === 0",
undefined是一个表示"无"的原始值,
Number(undefined) === NaN```null
表示一个值被定义了, 但是这个值是空值- 作为函数的参数, 表示函数的参数不是对象
- 作为对象原型链的终点
OBject.getPrototypeOf(Object.prototype)
undefined
表示不存在该值的定义- 变量被声明了还没有赋值, 表现为
undefined
- 调用函数时应该提供的参数没有提供, 参数值表现为
undefined
- 对象没有赋值的属性, 该属性的值表现为
undefined
- 函数没有返回值, 默认返回
undefined
- 变量被声明了还没有赋值, 表现为