Javascript 如果([]==false)为true,为什么([]| | true)会导致[]?
我只是在做一些测试,我觉得这很奇怪:Javascript 如果([]==false)为true,为什么([]| | true)会导致[]?,javascript,comparison,truthiness,Javascript,Comparison,Truthiness,我只是在做一些测试,我觉得这很奇怪: [] == false 如果为true,这是有意义的,因为double equal只比较内容而不比较类型,并尝试执行类型强制。但如果它比较内容并返回true,则表示[]为false(如果您执行了[]==true操作,则也会得到false),这意味着: [] || false 应该给假,但它给[],使它真实?为什么? 另一个例子: "\n " == 0 给出true,但“\n”| | false给出“\n”?这有什么解释吗?或者这只是一个奇怪的现象 当
[] == false
如果为true,这是有意义的,因为double equal只比较内容而不比较类型,并尝试执行类型强制。但如果它比较内容并返回true,则表示[]为false(如果您执行了[]==true
操作,则也会得到false),这意味着:
[] || false
应该给假,但它给[],使它真实?为什么?
另一个例子:
"\n " == 0
给出true,但“\n”| | false
给出“\n”
?这有什么解释吗?或者这只是一个奇怪的现象
当我在C中尝试这个时,我们得到:
int x = "\n " == 0;
printf("%d\n", x);
int y = "\n " || 0;
printf("%d\n", y);
产出:
0
1
这是有道理的,但是考虑到C对Javascript的影响,行为是不同的。“is false”(即使使用强制)不同于“在布尔上下文中计算为false”。obj==false
询问对象是否为布尔值false
,而不是在布尔上下文中计算时是否会这样计算
您可以使用(!!obj)
在布尔上下文中计算对象
类型转换与falsy和truthy值无关 什么是truthy,什么是falsy,由规范中定义的函数定义,
[]
确实是truthy
另一方面,[]==false
返回true
,因为在表达式求值期间会发生这种情况
类型转换规则规定,对于x==y
如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)
结果为0表示false,因此我们只剩下[]==0
的求值。按照同样的规则
如果类型(x)是Object,类型(y)是String或Number,则返回比较结果ToPrimitive(x)==y
结果为空字符串。现在我们有了“”==0
。回到我们的类型转换规则
如果类型(x)是字符串,类型(y)是数字,
将比较结果返回到数字(x)=y
对于”
,结果为0,因此最终计算结果为0==0
,即true
来自(第83页):
如果ToBoolean(lval)为true,则返回lval
不是JavaScript。“哎呀!”丹达维修好了。谢天谢地,我的答案的基本前提仍然有效,只是切换了一些语法。
[]
是一个真实的表达式,但是==
执行强制。中介绍了规则(搜索可能会找到相关问题)。请参阅此WTF JS:JS中没有ToBoolean(),因此如果找不到更好的匹配项,类型转换通常会转换为布尔值。如果它可以作为一个字符串或数字进行比较,那么在选择真/假之前,它会更愿意这样做。@dandavisToBoolean
,正如我所说的规范所定义的那样。这是JS解释器使用的函数,不是JS函数OK,你是对的,但这如何解释为什么[]被转换为字符串以与false进行比较?@dandavis这都在我给出的链接中,但我在回答中编辑了完整的解释。@dandavis很高兴你能欣赏!
[] == false; // true
(!![]) == false; // false
"\n " == false; // true
(!!"\n ") == false; // false
[] || false; // []