繁体   English   中英

javascript 真实数字

[英]javascript truthy numbers

基于这些规则:

假的:

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

真相其他一切

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

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

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

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

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

  1. 如果 Type(x) 与 Type(y) 相同,则
    • 返回执行严格相等比较 x === y 的结果。
  2. 如果 x 为空且 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) 是布尔值,则返回 ToNumber(x) == y 的比较结果。
  7. 如果 Type(y) 是布尔值,则返回比较结果 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) 不是 String,所以继续
  6. Type(x) 不是布尔值,所以继续
  7. Type(y) 是布尔值,所以返回 x == ToNumber(y) 的结果
    • ToNumber(true) 为 1,由于 2 == 1 为假,所以结果为假

但请注意,对于1 == true示例,第 7 步是不同的:

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

这是一个非常有趣的原因,根据这本书,当您像正在做的那样将任何东西与布尔值进行比较时,例如在x == y它遵循以下模式:

如果 Type(x) 是布尔值,则返回 ToNumber(x) == y 的比较结果。

如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。

因此,当你比较1 == true它实际上是在做1 == ToNumber(true)然后变成1 == 1 ,但是当你做2 == true它变成2 == 1这当然是假的。

这和书中给出的其他一些原因建议不要将事物与布尔值进行比较。

当您与布尔值进行比较时,值本身是真还是假并不重要,因为它永远不会变成布尔值,但布尔值被强制转换为可以与另一侧进行比较的类型==运算符。

我希望你觉得这个答案令人满意。

using ==不同于if(something)这个测试会给你你预期的结果:

function truthyFalsyTest()
{
    if(0) 
    {
       console.log("true");
    }
    else
    {
        console.log("false");
    }

    if(1) 
    {
       console.log("true");
    }
    else
    {
        console.log("false");
    }

    if(2) 
    {
       console.log("true");
    }
    else
    {
        console.log("false");
    }

    if(2222) 
    {
       console.log("true");
    }
    else
    {
        console.log("false");
    }
}

truthyFalsyTest();

在 JavaScript 中,(==) 是一个相等运算符,用于完成类型转换。 更严格的 (===) 标识运算符不会进行类型转换。

例如,即使数字不是布尔值,如果使用 (==) 运算符,您也可以在需要布尔值的地方使用数字值。

但是,如果您强制使用更严格的 (===) 运算符,您将看到 '1 === true' 的计算结果为 false。

基于这些规则:这里的问题是==不按这些规则运行。 某事是否为真以及它在相等性测试中的表现是两件不同的事情。 为了记录,对真实性的更正确测试将是

if (value) 
    return true;
else
    return false;

甚至更短 - 直接转换Boolean(value) (和隐式转换!!value

但是,在相等测试期间, ==两边都将转换为相同的基本类型,然后进行实际测试。 MDN 有一个转换规则列表- 直接从它 a 1 == true使用一个数字和一个布尔值,因此,两者的基本类型都是number JavaScript 环境将通过调用ToNumber(booleanValue)来解决这个问题,所以这里是相等测试实际测试的内容

 var convertedBooleanOperand = Number(true); console.log("convertedBooleanOperand", convertedBooleanOperand);

实际上, 2 == true被转换为2 == 1 ,即false

0 是假的,这并不意味着 othernumber 将是真的.. 简单的例子。 如果您在条件中使用 === 那么您将看到所有数字的错误。

(0 == true) // false
(1 == true) // true

它工作正常。 但是,在下面的示例中,我没有在条件中使用 not 运算符 (!)。 因此,如果条件为真,则应打印真否则为假。 它仍然会给你相反的结果。

if(0){console.log("true")}else{console.log("false")} // false
if(1){console.log("true")}else{console.log("false")} // true
if(15){console.log("true")}else{console.log("false")} // true

现在,如果您将数字转换为布尔值,那么它会给出您所想的结果。

Boolean(0) == true // false
Boolean(1) == true // true
Boolean(2) == true // true
Boolean(othernumber) == true // true

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM