为什么(null == false)和(null == true)都返回false?

59

我知道null是一个没有属性或函数的对象。

但是,我困惑的是为什么console.log(null == false);console.log(null == true);都返回false。

nullboolean之间的转换规则是什么?


9
它们都等于false,因为null既不等于true也不等于false。就像1不等于"pizza"或{}一样。当在if语句中单独使用时,它会被强制转换为布尔值false,因为它是假值。 - Patrick Evans
Null是一个字面量,false是布尔类型,可能两者都是不可比较的类型。 - Naresh kumar
3
请查看JavaScript中“truthy”和“falsey”概念。在“==”运算符背后发生的事情比表面上看到的要多。您正在遇到其中一个奇怪的边缘情况。 - Katie Kilian
4个回答

69
这是因为在表达式 x == y 中,Type(x)Type(y) 是布尔类型时,抽象相等比较算法 要求将布尔值通过 ToNumber 强制转换为数字,将 true 转换为 1,将 false 转换为 +0
这意味着任何形如 true == somethingsomething == true 的比较都会得到 1 == somethingsomething == 1 的结果(对于 false,用 +0false 替代 1true 进行比较)。 null 类型 不等于 1 或 +0(事实上,在 抽象相等比较算法 中,null 只能与 undefined 进行比较)。
如果你将 null 强制转换为数字,则其会被强制转换为 +0,因此 +null == false 的结果实际上是 true
如果想了解更多关于 JavaScript 中所有不同类型的相等性的详细讨论,请查看 MDN

非常感谢,我还有一个疑问,我知道 isNaN(null) 等于 falseNumber(null) 等于 0,为什么 null 可以强制转换为 undefined 而不是 0 - iatboy
在这种情况下,nullundefined 是等价的,因为它们是 JavaScript 中唯一不能处理任何属性访问的两个元素。(0).toString() === "0", 但是 (null).anything 的结果是 TypeError - Sean Vieira
完整答案请参见 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness。 - stevemao
@SeanVieira 为什么你在 ToNumber 操作后写 false 变成 +0?它不就像是 0 吗?此外,我尝试在 Chrome-DevTools 控制台中执行 ToNumber(false),但它未被定义,这是一个已弃用的函数吗? - user9245344
ToNumber 是 ECMAScript 规范中描述的一个操作,而不是您可以调用的函数(实际上,它是 JS 引擎必须具备的例程的描述,而不是 JS 引擎必须通过函数向语言公开的内容)。 - Sean Vieira

3

在当前讨论中,需要补充的是null >= false会返回true

我认为这是因为被解释为!(null < false)


更有可能的原因是,在比较之前,双方都调用了"ToNumber"例程,并且"ToNumber"将false和null都设置为+0。 - Félix Brunet

2
答案:null和boolean之间没有相关性。
MDN来源:

The value null is a literal (not a property of the global object like undefined can be). In APIs, null is often retrieved in place where an object can be expected but no object is relevant. When checking for null or undefined beware of the differences between equality (==) and identity (===) operators (type-conversion is performed with the former).

// foo does not exist, it is not defined and has never been initialized:
> foo
"ReferenceError: foo is not defined"

// foo is known to exist now but it has no type or value:
> var foo = null; foo
"null"

Difference between null and undefined

typeof null        // object (bug in ECMAScript, should be null)
typeof undefined   // undefined
null === undefined // false
null  == undefined // true

JavaScript | MDN


5
你应该更清晰地表明你在回答中哪些部分是来自于源内容,哪些部分是你自己写的。请参考http://stackoverflow.com/help/referencing。 - BoltClock

2

null 是 JavaScript 中的一个字面量,表示“空”或“未定义”的值。它是 JavaScript 的原始值之一,既不等于布尔值 true 也不等于布尔值 false,因为它的值是未定义的。尽管它不是 false,但 null 的值更倾向于 false。这就是为什么它被称为“假值”运算符,当变量 var 等于 null 时,if (var) { } 块不会被执行。


var不应该被用作变量名,因为它是一个保留字。示例中应该使用someVar而不是var - SherylHohman
不要把“..它的值未定义”和undefined的值混淆在一起。更好地表达为“..其值未知”。 - SherylHohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接