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

Javascript array to boolean type coercion not making sense

本文关键字:有意义 类型 数组 布尔 Javascript      更新时间:2024-01-07

当我运行以下代码行时:

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

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

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

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

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

通过松散的比较,事情有点演变:

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

松散比较的算法可以在ECMAScript规范中找到

另请参阅为什么{}==false求值为false,而[]==false的求值为true?,其中列出了转换步骤。

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

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


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

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

var x = [];
document.writeln(!x);
document.writeln(x == false);

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

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

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