问题出现在标题中。我刚刚尝试在Chrome控制台中运行下一条语句,结果如下:为什么JS中的true =='true'语句返回false?
true == 'true' // returns false
'true' == true // returns false
为什么会这样?为什么不在那里工作,但在下一个声明中起作用?
if ('true') true // returns true
问题出现在标题中。我刚刚尝试在Chrome控制台中运行下一条语句,结果如下:为什么JS中的true =='true'语句返回false?
true == 'true' // returns false
'true' == true // returns false
为什么会这样?为什么不在那里工作,但在下一个声明中起作用?
if ('true') true // returns true
因为它们不代表同等可兑换的类型/值。 ==
使用的转换比if ('true')
使用的简单toBoolean
转换复杂得多。
所以给这个代码true == 'true'
,它发现这一点: “如果Type(x)
是Boolean
,回报比较ToNumber(x) == y
的结果”
所以你看它开始通过成为ToNumber(true) == 'true'
,这是1 == 'true'
,然后再次尝试,它现在发现:
如果
Type(x)
是Number
和Type(y)
是String
,返回的结果比较x == ToNumber(y)
。
所以现在做1 == ToNumber('true')
,这是1 == NaN
,这当然是false
。
来源:http://es5.github.io/#x11.9.3 –
+1很好解释!你能链接这些信息的来源吗? –
@PhilippSander:使用火箭的链接。这是一个非官方的副本,但有很好的交叉链接和注释。它是*抽象平等比较算法*。 –
true是一个布尔值 'true'是一个字符串。
您正在比较不同的数据类型。 look here: http://w3schools.com/js/js_datatypes.asp
javascript在使用==时转换类型,但不能与=== –
哦。很多讨厌。但w3真的帮助我回到了一天,以开始使用JavaScript。他们从未试图成为“规范”。只是一个简单的方法让人们去。在任何一所学校里,为了理解起见,你总是过分简单化,然后再提出“真相”。 – AwokeKnowing
@Akeke也许,但你认为用户期望什么?我敢打赌你的意思不是“真相”。参考MDN 100500倍更好。最后他们拥有自己的浏览器和JS引擎,而不是w3fools。 – antyrat
真=布尔类型
“真” =串类型
表述“如果(‘真’)”的计算结果的“真”(字符串)为真(布尔值)以同样的方式如果('foo')或其他任何字符串都行。
一个非空字符串将返回true:
if ('0') true; // true
if ('false') true; // true
if ('anything') true; // true
空字符串将返回不确定的,因而是falsy:
if ('') true; // not true
当比较类型,JavaScript的会尽量做一些魔术给你:
if (1 == "1") true; // true
但将字符串转换为布尔值,当它失败:
if(true == "true") true; // not true
==
运营商使用ECMAScript的abstract equality algorithm这非常复杂。它的确切行为取决于涉及的每个参数的类型,每个步骤通常涉及另一个调用另一个ECMAScript函数。
if(condition)
语句使用ECMAScript的ToBoolean
将condition
转换为布尔值,该语法很简单,可以在单个表中表示。正如您在规范中所看到的,如果长度不为零,则任何字符串都是truthy(根据ToBoolean
)。
@霍根:它仍然是'假'。 –
http://docs.nodejitsu.com/articles/javascript-conventions/what-are-truthy-and-falsy-values – Hogan
类型转换也适用于前两个片段,虽然'true'被转换为'1'! ==“真”。 – Teemu