2013-10-30 90 views
5

问题出现在标题中。我刚刚尝试在Chrome控制台中运行下一条语句,结果如下:为什么JS中的true =='true'语句返回false?

true == 'true' // returns false 
'true' == true // returns false 

为什么会这样?为什么不在那里工作,但在下一个声明中起作用?

if ('true') true // returns true 
+2

@霍根:它仍然是'假'。 –

+0

http://docs.nodejitsu.com/articles/javascript-conventions/what-are-truthy-and-falsy-values – Hogan

+1

类型转换也适用于前两个片段,虽然'true'被转换为'1'! ==“真”。 – Teemu

回答

15

因为它们不代表同等可兑换的类型/值。 ==使用的转换比if ('true')使用的简单toBoolean转换复杂得多。

所以给这个代码true == 'true',它发现这一点: “如果Type(x)Boolean,回报比较ToNumber(x) == y的结果”

所以你看它开始通过成为ToNumber(true) == 'true',这是1 == 'true',然后再次尝试,它现在发现:

如果Type(x)NumberType(y)String,返回的结果比较x == ToNumber(y)

所以现在做1 == ToNumber('true'),这是1 == NaN,这当然是false

+3

来源:http://es5.github.io/#x11.9.3 –

+0

+1很好解释!你能链接这些信息的来源吗? –

+0

@PhilippSander:使用火箭的链接。这是一个非官方的副本,但有很好的交叉链接和注释。它是*抽象平等比较算法*。 –

-3

true是一个布尔值 'true'是一个字符串。

您正在比较不同的数据类型。 look here: http://w3schools.com/js/js_datatypes.asp

+0

javascript在使用==时转换类型,但不能与=== –

+0

哦。很多讨厌。但w3真的帮助我回到了一天,以开始使用JavaScript。他们从未试图成为“规范”。只是一个简单的方法让人们去。在任何一所学校里,为了理解起见,你总是过分简单化,然后再提出“真相”。 – AwokeKnowing

+0

@Akeke也许,但你认为用户期望什么?我敢打赌你的意思不是“真相”。参考MDN 100500倍更好。最后他们拥有自己的浏览器和JS引擎,而不是w3fools。 – antyrat

0

真=布尔类型

“真” =串类型

表述“如果(‘真’)”的计算结果的“真”(字符串)为真(布尔值)以同样的方式如果('foo')或其他任何字符串都行。

0

一个非空字符串将返回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
2

==运营商使用ECMAScript的abstract equality algorithm这非常复杂。它的确切行为取决于涉及的每个参数的类型,每个步骤通常涉及另一个调用另一个ECMAScript函数。

if(condition)语句使用ECMAScript的ToBooleancondition转换为布尔值,该语法很简单,可以在单个表中表示。正如您在规范中所看到的,如果长度不为零,则任何字符串都是truthy(根据ToBoolean)。

相关问题