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

时间:2015-02-19 01:59:25

标签: javascript

当我运行以下代码行时:

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

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

3 个答案:

答案 0 :(得分:2)

tl; dr: 值转换为布尔值与值与布尔值进行比较非常不同,因为JavaScript具有隐式类型转换。< / p>

  

有人可以向我解释这里发生了什么吗?

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

通过松散的比较,事情变得更加发展:

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

松散比较的算法可以在ECMAScript spec

中找到

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

  

我假设使用了!会严格强制类型,类似于它在PHP中的工作方式。

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


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

答案 1 :(得分:1)

实际上,我认为它确实以您的思维方式运作:

&#13;
&#13;
var x = [];

document.writeln(!x);
document.writeln(x == false);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

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

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

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