在 JavaScript 中,为什么“0”等于 false,但是当通过 'if' 测试时,它本身不是 false?

IT技术 javascript boolean
2021-01-20 12:47:06

以下显示"0"在 Javascript为 false:

>>> "0" == false
true

>>> false == "0"
true

那么为什么会打印以下内容"ha"呢?

>>> if ("0") console.log("ha")
ha
6个回答

显示问题的表格:

真实的 if 语句

和 == javascript中所有对象类型的真实比较

故事寓意=== 严格平等显示理智

表生成信用:https : //github.com/dorey/JavaScript-Equality-Table

我的一个朋友制作了f.cl.ly/items/3b0q1n0o1m142P1P340P/javascript_equality.html - 与上面相同的图表,但更容易阅读。
2021-03-17 12:47:06
从今以后,如果有人说他从不使用严格的比较运算符,我会用这些表面对他,让他哭。仍然不确定我是否掌握了NaN尽管的概念我的意思是,typeof NaN // number但是NaN === NaN // false,嗯...
2021-03-22 12:47:06
这些表有错误。无论是==还是===运营商的[]{}[[]][0][1]值不计算为true。我的意思是[] == [][] === []也是假的。
2021-04-02 12:47:06
使用另一个值顺序更有意义gist.github.com/kirilloid/8165660
2021-04-08 12:47:06
@JustusRomijn 有多个值要表示NaN,因此当您比较 2 个 NaN 时,它们具有不同的值(我猜)。这里阅读第一句话
2021-04-09 12:47:06

原因是因为当你显式执行时"0" == false,双方都被转换为数字,然后进行比较。

当您执行以下操作时:if ("0") console.log("ha"),正在测试字符串值。任何非空字符串都是true,而空字符串是false

等于 (==)

如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格的比较。如果操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则另一个操作数在可能的情况下转换为字符串。如果两个操作数都是对象,那么当操作数引用内存中的同一个对象时,JavaScript 会比较内部引用是否相等。

(从比较运算符在Mozilla开发者网络)

这是根据规范。

12.5 if 语句 
.....

2. 如果 ToBoolean(GetValue(exprRef)) 为真,则 
一个。返回评估第一个 Statement 的结果。
3. 否则, 
....

根据规范,ToBoolean 是

抽象操作 ToBoolean 根据表 11 将其参数转换为 Boolean 类型的值:

那个表格是关于字符串的:

在此处输入图片说明

如果参数是空字符串(其长度为零),则结果为假;否则结果为真

现在,解释为什么"0" == false你应该阅读相等运算符,它声明它从抽象操作GetValue(lref)获取其值与右侧的相同。

将这一相关部分描述为:

如果 IsPropertyReference(V),则 
一个。如果 HasPrimitiveBase(V) 为 false,则令 get 为 base 的 [[Get]] 内部方法,否则令 get
是下面定义的特殊 [[Get]] 内部方法。 返回以base为this值调用get内部方法的结果,并通过
参数的 GetReferencedName(V)

或者换句话说,一个字符串有一个原始基础,它回调内部的 get 方法并最终看起来是假的。

如果您想使用 GetValue 操作使用来评估事物==,如果您想使用, 进行评估ToBoolean,请使用===(也称为“严格”相等运算符)

我在哪里可以找到规范?
2021-03-23 12:47:06
"a string has a primitive base, which calls back the internal get method and ends up looking false" 所有字符串都是这样吗?
2021-03-30 12:47:06
@Interstellar_CoderSection 8.12.3: [[Get]] (P)描述了它是如何工作的。这仅适用于字符串为 0 的情况,因为它执行了一系列其他内部调用,最终导致GetOwnProperty“无论”是一个数据属性,然后一直返回该值。这就是为什么“0”是假的,而“blah”是真的。查看 Yahoo 开发者剧院上 Douglas Crockford 的一些视频,他描述 JavaScript 中的“真实性”比我要简单一些。如果您了解“真实”和“虚假”的含义,您就会立即理解 Bobince 的答案。
2021-03-31 12:47:06

PHP 中的字符串"0"为假(false-when-used-in-boolean-context)。在 JavaScript 中,所有非空字符串都是真值。

诀窍是,==针对布尔值不会在布尔上下文中进行评估,它会转换为数字,并且在字符串的情况下是通过解析为十进制来完成的。所以你得到 Number0而不是 truthiness boolean true

这是一个非常糟糕的语言设计,也是我们尽量不使用不幸的==运算符的原因之一使用===来代替。

// I usually do this:

x = "0" ;

if (!!+x) console.log('I am true');
else      console.log('I am false');

// Essentially converting string to integer and then boolean.