javascript真实数字

时间:2018-09-13 19:50:01

标签: javascript equality

基于以下规则:

虚假:

  • false
  • 0(零)
  • ''或“”(空字符串)
  • 未定义
  • NaN(例如1/0的结果)

真正的:其他一切

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

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

6 个答案:

答案 0 :(得分:3)

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

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

==有其自己的不同规则集,用于确定其操作数的松散相等性,在规范的Abstract Equality Comparison algorithm中有详细解释:

  
      
  1. 如果Type(x)与Type(y)相同,则      
        
    • 返回执行严格相等比较x === y的结果。
    •   
  2.   
  3. 如果x为null且y未定义,则返回true。
  4.   
  5. 如果x未定义且y为空,则返回true。
  6.   
  7. 如果Type(x)为Number而Type(y)为String,则返回比较结果x == ToNumber(y)。
  8.   
  9. 如果Type(x)为String,Type(y)为Number,则返回比较结果ToNumber(x)== y。
  10.   
  11. 如果Type(x)为布尔型,则返回比较结果ToNumber(x)== y。
  12.   
  13. 如果Type(y)为布尔型,则返回比较结果x == ToNumber(y)。
  14.   
  15. 如果Type(x)是字符串,数字或符号,而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  16.   
  17. 如果Type(x)是Object并且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
  18.   
  19. 返回false。
  20.   

请参阅规范以获取其中列出的各种抽象操作的完整详细信息,尽管名称几乎说明了它们的作用。 (如果您查看规范,则会在!之前的各个地方看到ToNumber;在上面已将其删除。它是 not 逻辑NOT运算符,它是a spec notation related to "abrupt completions."

下面以您的2 == true示例为例:

  1. 类型不同,所以继续吧
  2. x不是null,所以继续吧
  3. x不是未定义的,所以继续吧
  4. Type(x)确实是数字,但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

答案 1 :(得分:2)

根据this book,这是一个非常有趣的原因,当您将任何内容与布尔值进行比较时,例如在x == y中,它遵循以下模式:

  

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

     

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

因此,当您比较1 == true时,实际上是在做1 == ToNumber(true),然后变成1 == 1,但是当您进行2 == true时,它变成了2 == 1当然是错误的。

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

与布尔值进行比较时,值本身是真还是虚假都没有关系,因为它永远不会转变为布尔值,但是布尔值会强制转换为可以与另一个值进行比较的类型==运算符的侧面。

希望您对此答案感到满意。

答案 2 :(得分:0)

使用==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();

答案 3 :(得分:0)

在JavaScript(==)中,是用于完成类型转换的相等运算符。更为严格的(===)身份运算符将不会进行类型转换。

例如,即使数字不是布尔值,也可以使用数字值,如果使用(==)运算符,则期望布尔值。

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

答案 4 :(得分:0)

Based on these rules:这里的问题是==不受这些规则约束。事物是否真实以及在相等性测试期间的行为是两个不同的问题。根据记录,对真实性的更正确测试将是

if (value) 
    return true;
else
    return false;

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

但是,在相等性测试期间,==的两侧将转换为相同的基本类型,然后然后进行实际测试。 MDN has a list of rules for the conversion-直接从 1 == true使用数字和布尔值,因此两者的基本类型都是 number 。 JS解析器将执行ToNumber(booleanValue),因此这是相等测试实际测试的

var convertedBooleanOperand = Number(true);

console.log("convertedBooleanOperand", convertedBooleanOperand);

实际上,2 == true被转换为2 == 1的{​​{1}}。

答案 5 :(得分:0)

0为假,并不意味着othernumber将为true。 简单的例子。如果在条件中使用===,则所有数字都将为假。

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

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

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

谢谢