首页 > 解决方案 > javascript 真实数字

问题描述

基于这些规则:

假的:

真实:其他的一切

我找不到正确解释为什么在以下测试中,只有数字 1 评估为“真”

0 == true ("false")
1 == true ("true")
2 == true ("false")
othernumber == true ("false")

标签: javascriptequality

解决方案


“真”和“假”规则仅适用于将值本身用作测试时,例如:

var str = "";
if (str) {
    // It's truthy
} else {
    // It's falsy
}

==有自己的,不同的,一组规则来确定其操作数的松散相等性,这些规则在规范的抽象相等比较算法中得到了彻底的解释:

  1. 如果 Type(x) 与 Type(y) 相同,则
    • 返回执行严格等式比较 x === y 的结果。
  2. 如果 x 为 null 且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String,则返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是 String 并且 Type(y) 是 Number,则返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String、Number 或 Symbol 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是 String、Number 或 Symbol,则返回比较 ToPrimitive(x) == y 的结果。
  10. 返回假。

有关其中列出的各种抽象操作的完整详细信息,请参阅规范,尽管名称几乎说明了它们的作用。(如果您查看规范,您会在各个地方看到!之前的ToNumber内容;我已经在上面删除了它。这不是逻辑 NOT 运算符,而是与“突然完成”相关的规范符号。

让我们以您的2 == true示例为例:

  1. 类型不一样,继续往下看
  2. x 不为空,所以继续
  3. x 不是未定义的,所以继续
  4. Type(x) 确实是 Number,但 Type(y) 不是 String,所以继续
  5. Type(x) 不是字符串,所以继续
  6. Type(x) 不是布尔值,所以继续
  7. Type(y) 是布尔型,所以返回 x == ToNumber(y) 的结果
    • ToNumber(true) 为 1,由于 2 == 1 为假,所以结果为假

但请注意,步骤 7 与您的1 == true示例不同:

  1. Type(y) 是布尔型,所以返回 x == ToNumber(y) 的结果
    • ToNumber(true) 为 1,由于 1 == 1 为真,所以结果为真

推荐阅读