Javascript数组到布尔类型的强制没有意义

Javascript数组到布尔类型的强制没有意义,javascript,Javascript,当我运行以下代码行时: var x = []; console.log(!x); console.log(x == false); > false > true 我假设使用!将正确地强制该类型,类似于它在PHP中的工作方式,并且这两个控制台日志将返回相同的输出。有人能给我解释一下这里发生了什么吗?事实上,我认为它确实像你所想的那样起作用: var x=[]; 文件写入号(!x); document.writeln(x==false)事实上,我认为它确实按照您的想法工作: var

当我运行以下代码行时:

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

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

事实上,我认为它确实像你所想的那样起作用:

var x=[];
文件写入号(!x);

document.writeln(x==false)事实上,我认为它确实按照您的想法工作:

var x=[];
文件写入号(!x);
document.writeln(x==false)tl;dr:将值转换为布尔值与将值与布尔值进行比较非常不同,因为JavaScript具有隐式类型转换

有人能给我解释一下这里发生了什么事吗

!x
与执行
相同!布尔值(x)
,即
x
显式转换为布尔值

通过松散的比较,事情变得更加复杂:

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

松散比较的算法可在中找到

另请参见,其中我列出了转换步骤

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

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


固执己见的建议:这是一个很好的例子,说明了如果可能的话,为什么应该避免隐式类型转换;dr:将值转换为布尔值与将值与布尔值进行比较非常不同,因为JavaScript具有隐式类型转换

有人能给我解释一下这里发生了什么事吗

!x
与执行
相同!布尔值(x)
,即
x
显式转换为布尔值

通过松散的比较,事情变得更加复杂:

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

松散比较的算法可在中找到

另请参见,其中我列出了转换步骤

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

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



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

好的,所以我认为我发现了问题:

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

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

好的,所以我想我发现了问题:

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


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

我最初输入了一个错误。我的问题是,为什么这两个输出会有什么不同呢?我本来是打错了。我的问题是,为什么这两个输出会有任何不同?我知道===和==之间的区别。我想在这里说明的一点是使用!未正确将类型强制为布尔值。我希望上述两个输出是相同的。当我运行该代码时,第一次测试的结果为false。@Frank在第一个答案中引用了我的评论。我打错了。用正确的输出编辑了问题。啊,对不起,我没有及时刷新页面以查看编辑。在这种情况下,可能==正在比较数据类型。我知道===和==之间的差异。我想在这里说明的一点是使用!未正确将类型强制为布尔值。我希望上述两个输出是相同的。当我运行该代码时,第一次测试的结果为false。@Frank在第一个答案中引用了我的评论。我打错了。用正确的输出编辑了问题。啊,对不起,我没有及时刷新页面以查看编辑。在这种情况下,可能==正在比较数据类型。等一下,我想你的第一句话是关于!x与布尔值(x)相同!emptyArray返回的输出与Boolean(emptyArray)不同,我还要补充一点,这是一个很好的答案。你对它的描述比我在谷歌上能找到的任何一篇文章都要好。等一下,我想你的第一句话是关于!x与布尔值(x)相同!emptyArray返回的输出与Boolean(emptyArray)不同,我还要补充一点,这是一个很好的答案。你对它的描述比我在谷歌上能找到的任何一篇文章都要好。我再一次在事后给出了意见。尽管如此,有时看到代码运行起来还是很好的,所以我将把它放在一边。再一次,我会在事后给出输入。尽管如此,有时看到代码运行起来还是很好的,所以我还是不说了。