The 抽象相等算法 http://es5.github.com/#x11.9.3语言规范第 11.9.3 节定义了==
and !=
它定义了它们
null == void 0
null == null
void 0 == null
where void 0
只是一种可靠的说法undefined
(见下文)所以你的问题的答案是肯定的,null
等于不明确的和它本身,没有别的。
规范的相关部分是
1. If Type(x) is the same as Type(y), then
If Type(x) is Undefined, return true.
If Type(x) is Null, return true.
...
2. If x is null and y is undefined, return true.
3. If x is undefined and y is null, return true.
...
如果你担心undefined
表示与通常含义不同的东西,使用void 0
反而。
null == void 0 // True
({}).x === void 0 // True
"undefined" === typeof void 0 // True
(function () {})() === void 0 // True
(undefined = 42,
undefined === void 0) // False
"undefined" === typeof undefined // False
"undefined" === typeof void 0 // True
来自语言规范 http://es5.github.com/#x11.4.2:
11.4.2 void 运算符
产生式一元表达式:void 一元表达式评价如下:
- Let
expr
是评估的结果一元表达式/.
- Call
GetValue(expr)
.
- Return 不明确的.
So the void
前缀运算符计算其参数并返回特殊值不明确的无论全局变量是什么undefined
已更改(或是否undefined
被定义为 :)。
编辑:为了回应评论,
如果您正在处理区分两者的库代码,那么您需要处理差异。语言委员会标准化的一些新库确实忽略了这种差异:JSON.stringify([void 0]) === "[null]"
但是有太多的代码对它们进行了微妙的不同处理,并且还有其他差异:
+(null) === 0
isNaN(+undefined)
"" + null === "null"
"" + undefined === "undefined"
如果您正在编写任何类型的生成文本或序列化/反序列化的库,并且您想将两者合并,那么您不能通过undefined
通过并期望它表现得像null
-- 您需要明确地将您的输入规范化为其中一个或另一个。