当我运行以下代码行时:
var x = []; console.log(!x); console.log(x == false);
> false
> true
我假设使用了!将正确强制类型与PHP中的工作方式类似,并且这两个控制台日志将返回相同的输出。有人可以向我解释这里发生了什么吗?
答案 0 :(得分:2)
tl; dr: 将值转换为布尔值与将值与布尔值进行比较非常不同,因为JavaScript具有隐式类型转换。< / p>
有人可以向我解释这里发生了什么吗?
!x
与执行!Boolean(x)
相同,即x
显式转换为布尔值。
通过松散的比较,事情变得更加发展:
如果两个操作数的数据类型不同,JS会将它们转换为相同的类型。但是,如果任何操作数是布尔值,则该值将转换为数字,与其他操作数的值无关。这反过来意味着另一个操作数也被转换为数字
因此[] == false
与Number([]) == Number(false)
相同。
松散比较的算法可以在ECMAScript spec。
中找到另请参阅Why does {} == false evaluate to false while [] == false evaluates to true?,其中列出了转换步骤。
我假设使用了!会严格强制类型,类似于它在PHP中的工作方式。
虽然肯定存在一些相似之处,但类型转换规则是完全独立的。
意见建议:这是一个很好的例子,说明为什么应该尽可能避免隐式类型转换。
答案 1 :(得分:1)
实际上,我认为它确实以您的思维方式运作:
var x = [];
document.writeln(!x);
document.writeln(x == false);
&#13;
答案 2 :(得分:1)
好的,我认为我发现了问题:
var x=[];
alert(x==false);// true;
x=[1];
alert(x==false);// false;
即使定义了x,除非它有内容,否则它不会返回true。