Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果([]==false)为true,为什么([]| | true)会导致[]?_Javascript_Comparison_Truthiness - Fatal编程技术网

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(),因此如果找不到更好的匹配项,类型转换通常会转换为布尔值。如果它可以作为一个字符串或数字进行比较,那么在选择真/假之前,它会更愿意这样做。@dandavis
ToBoolean
,正如我所说的规范所定义的那样。这是JS解释器使用的函数,不是JS函数OK,你是对的,但这如何解释为什么[]被转换为字符串以与false进行比较?@dandavis这都在我给出的链接中,但我在回答中编辑了完整的解释。@dandavis很高兴你能欣赏!
[] == false;         // true
(!![]) == false;     // false

"\n  " == false;     // true
(!!"\n  ") == false; // false
[] || false; // []