96

MDC 对==算子的描述如下

如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则尽可能将另一个操作数转换为字符串。

考虑到这一点,我将评估"true" == true如下:

  1. 它们是同一类型吗?
  2. 操作数是数字还是布尔值?是的
  3. 我们可以将两者都转换为数字吗?( isNaN(Number("true")) // true)
  4. 任一操作数都是字符串吗?是的
  5. 我们可以将另一个操作数转换为字符串吗?( String(true) === "true" // true)

我最终得到了字符串"true"and "true",它的计算结果应该是true,但 JavaScript 显示为 false。

我错过了什么?

4

5 回答 5

95

因为"true"转换为NaN,whiletrue转换为1。所以他们不同。

就像您报道的那样,两者都被转换为数字,因为至少true可以(参见 Erik Reppen 的评论),然后进行比较。

于 2012-07-06T14:01:08.220 回答
18

==比较运算符在ECMA 5 中定义为:

  1. 如果Type (x) 是 Number 并且Type (y) 是 String,则
    返回比较结果 x == ToNumber (y)。
  2. 如果Type (x) 是 String 并且Type (y) 是 Number,则
    返回比较结果ToNumber (x) == y。
  3. 如果Type (x) 是 Boolean,则返回比较结果ToNumber (x) == y。
  4. 如果Type (y) 为 Boolean,则返回比较结果 x == ToNumber (y)。

因此, "true" == true 被评估为:

  1. "true" == ToNumber (true)   (通过规则 7)
  2. “真” == 1
  3. ToNumber ("true") == 1   (通过规则 5)
  4. 南== 1

===> 假的

于 2015-05-22T09:58:14.593 回答
4

根据抽象等式比较算法

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

如果其中一个 oprend 是布尔值而另一个不是,则布尔值是数字 0 或 1 的转换器。所以true == "true"是假的。

于 2016-10-22T19:54:06.080 回答
1

相等运算符 (==!=) 使用抽象相等比较算法来比较两个操作数。

"true" == true

由于"true"isStringtrueis Boolean,我们需要返回"true" == Number(true)(算法中的步骤7)的结果,即"true" == 1

"true" == 1

由于"true"isString1is Number,我们需要返回(算法中的Number("true") == 1步骤)的结果。返回。现在我们有了.5Number("true")NaNNaN == 1

NaN == 1

现在两个操作数的类型相同 ( Number)。根据算法,如果两个操作数都是Number并且其中一个是NaNfalse则返回(1.c.i算法中的步骤)。

于 2021-09-15T20:35:25.843 回答
0

解释考虑场景true == "true"
直接,上面返回false,然而,我们的期望是true
J​​avaScript 使用抽象相等比较算法,所以根据算法

true == "true"

// If one of the operands is Boolean, convert the Boolean operand to 1 if it is true and +0 if it is false
ConvertToNumber(true) == "true"

1 == "true"

// When the algorithm finds the above statements, it thinks that it needs to do one more conversion - 
// "When comparing a number to a string, try to convert the string to a numeric value"
1 == ConvertToNumber("true)
1 == NaN

// Which returns false
于 2021-06-10T12:52:59.320 回答