【问题标题】:Javascript array to boolean type coercion not making senseJavascript数组到布尔类型强制没有意义
【发布时间】:2015-04-20 06:31:04
【问题描述】:

当我运行以下代码行时:

var x = []; console.log(!x); console.log(x == false);
> false
> true

我假设使用 !将正确强制类型,类似于它在 PHP 中的工作方式,并且这两个控制台日志将返回相同的输出。有人可以向我解释这里发生了什么吗?

【问题讨论】:

  • 我知道 === 和 == 之间的区别。我想在这里说明的一点是使用 !没有强制类型正确地布尔值。我希望上述两个输出是相同的。
  • 当我运行该代码时,我在第一次测试中得到了错误。
  • @Frank 参考我在第一个答案中的评论。我打错了。使用正确的输出编辑问题。
  • 啊,抱歉,我没有及时刷新页面来查看编辑内容。
  • 在这种情况下,== 可能是在比较数据类型。

标签: javascript


【解决方案1】:

tl;dr: 将值转换到布尔值与比较值到布尔值非常不同,因为 JavaScript 具有隐式类型转换。

谁能给我解释一下这里发生了什么?

!x!Boolean(x) 相同,即x 被显式转换为布尔值。

通过松散的比较,事情变得更加进化:

如果两个操作数的数据类型不同,JS会将它们都转换为相同的类型。但是,如果任何操作数是布尔值,则该值将转换为数字,而与另一个操作数的值无关。这反过来意味着另一个操作数也被转换为数字。
所以[] == falseNumber([]) == Number(false) 是一样的。

松散比较算法见ECMAScript spec

另请参阅Why does {} == false evaluate to false while [] == false evaluates to true?,我在其中列出了转换步骤。

我假设使用 !将正确强制类型,类似于它在 PHP 中的工作方式。

虽然肯定有一些相似之处,但类型转换规则是完全独立的。


意见建议:这是一个很好的例子,说明了为什么应该尽可能避免隐式类型转换。

【讨论】:

  • 等一下,我认为您关于 !x 的第一个陈述与 Boolean(x) 相同。 !emptyArray 返回与 Boolean(emptyArray) 不同的输出
  • 我还必须补充一点,这是一个很好的答案。你对它的描述比我在谷歌上找到的任何文章都好。
【解决方案2】:

实际上,我认为它确实按照您的想法工作:

var x = [];

document.writeln(!x);
document.writeln(x == false);

【讨论】:

  • 我原来打错了。我的问题是,为什么这两个输出会有所不同?
【解决方案3】:

好的,所以我想我找到了问题:

var x=[];
alert(x==false);// true;
x=[1];
alert(x==false);// false;

即使定义了 x,它也不会返回 true,除非它有内容。

【讨论】:

  • 再一次,我在事后提供意见。不过,有时看到代码在运行中还是不错的,所以我将保留它。
猜你喜欢
  • 2015-07-09
  • 2015-12-17
  • 2020-08-29
  • 1970-01-01
  • 2015-07-05
  • 2016-01-30
  • 2016-09-04
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多