首页 > 技术文章 > JS中的undefined与null

frank-link 2021-09-22 14:34 原文

大多数计算机语言,有且仅有一个表示"无"的值,比如,C 语言的 NULLJava 语言的 nullPython 语言的 NoneRuby 语言的 nil

有点奇怪的是,JavaScript 语言居然有两个表示"无"的值:undefinednull。这是为什么?

异同点

相似

  1. 值仅有一个,在 JavaScript 中,undefinednull 都是基础数据类型,他们的值有且仅有一个,分别为 undefinednull

  2. 没有方法,undefinednull 都不能调用方法

  3. 表示 无,转为布尔类型时,结果均为 false

区别

  1. null 是一个关键字, undefined 不是关键字,当定义变量时, undefined 可以作为变量名, null 不行

  2. null 的本质是一个标识为 '空' 的对象, undefinedwindow 对象的一个属性, 虽然 undefined 直接翻译的结果是 '未定义',但实质上 undefined 是一个已经定义了的属性,只不过它的值叫做 '未定义'

历史原因

这与 JavaScript 的历史有关。1995 年 JavaScript 诞生 时,最初像 Java 一样,只设置了 null 作为表示 "无" 的值。

根据 C 语言的传统,null 被设计成可以自动转为 0

Number(null); // 0

5 + null; // 5

但是,JavaScript 的设计者 Brendan Eich,觉得这样做还不够,有两个原因。

首先,null 像在 Java 里一样,被当成一个对象。但是,JavaScript 的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich 觉得表示 "无" 的值最好不是对象。

其次,JavaScript 的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich 觉得,如果 null 自动转为 0,很不容易发现错误。

因此,Brendan Eich 又设计了一个 undefined

最初的设计

JavaScript 的最初版本是这样区分的:null 是一个表示 "无" 的对象,转为数值时为 0undefined 是一个表示 "无" 的原始值,转为数值时为 NaN

Number(undefined); // NaN

5 + undefined; // NaN

用法

但是,上面这样的区分,在实践中很快就被证明不可行。目前,nullundefined 基本是同义的,只有一些细微的差别。

null 表示"没有对象",即该处不应该有值。典型用法是:

  1. 作为函数的参数,表示该函数的参数不是对象。
  2. 作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype); // null

undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

  1. 变量被声明了,但没有赋值时,就等于 undefined
  2. 调用函数时,应该提供的参数没有提供,该参数等于 undefined
  3. 对象没有赋值的属性,该属性的值为 undefined
  4. 函数没有返回值时,默认返回 undefined
var i;
i; // undefined

function f(x) {
  console.log(x);
}
f(); // undefined

var o = new Object();
o.p; // undefined

var x = f();
x; // undefined

参考:http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html

推荐阅读