javascript 真实数字

Dav*_*vid 4 javascript equality

基于这些规则:

虚假:

  • 错误的
  • 0(零)
  • '' 或 ""(空字符串)
  • 无效的
  • 未定义的
  • NaN(例如 1/0 的结果)

真相:其他一切

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

0 == true ("false")
1 == true ("true")
2 == true ("false")
othernumber == true ("false")
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

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

var str = "";
if (str) {
    // It's truthy
} else {
    // It's falsy
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 如果 Type(x) 与 Type(y) 相同,则
    • 返回执行严格相等比较 x === y 的结果。
  2. 如果 x 为 null 并且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为 null,则返回 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. 返回假。

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

让我们按照您的示例进行操作2 == true:

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

1 == true但请注意,步骤 7 对于您的示例有所不同:

  1. Type(y) 是布尔值,因此返回 x == ToNumber(y) 的结果
    • ToNumber(true) 为 1,由于 1 == 1 为 true,因此结果为 true