Javascript true / false函数

时间:2015-07-24 09:02:10

标签: javascript

我是JavaScript的新手,我发现了一些我无法理解的奇怪行为:

var magicVar = Math.sin;
magicVar == true; // it returns false
magicVar === true; // it returns false
if (magicVar) console.log("???"); // it prints "???"

发生了什么事?

谢谢。

5 个答案:

答案 0 :(得分:4)

var magicVar = Math.sin;

magicVar上的Math.sin引用了Object函数,实际上是magicVar == true; // it returns false (请参阅MDN上的Function

  

Function构造函数创建一个新的Function对象。在JavaScript中   每个函数实际上都是一个Function对象。

false

这是Object:来自MDN上的Equality comparison and sameness,如果您使用Boolean运算符将==类型的操作数与类型为false的操作数进行比较你总是得到magicVar == true magicVar == Number(true) // Step 9. x == ToNumber(y). magicVar == 1 toPrimitive(magicVar) == 1 // Step 11. ToPrimitive(x) == y. magicVar.toString() == 1 "function sin() { [native code] }" == 1 Number("function sin() { [native code] }") == 1 // Step 7. ToNumber(x) == y. NaN === 1 // Step 3. x === y. false (使用== 表查看松散平等)。

[编辑]正如Bergi在评论中指出的那样,实际上在某些情况下你可以将对象与布尔值进行松散比较,返回true。

幕后实际发生的是ES6 §7.2.12中描述的比较算法已应用。

  

7.2.12抽象平等比较

     

比较x == y,其中x和y是值,产生true或   假。这样的比较如下进行:

     
      
  1. ReturnIfAbrupt(X)。
  2.   
  3. ReturnIfAbrupt(Y)。
  4.   
  5. 如果Type(x)与Type(y)相同,则返回执行严格等式比较的结果x === y。
  6.   
  7. 如果x为null且y未定义,则返回true。
  8.   
  9. 如果x未定义且y为null,则返回true。
  10.   
  11. 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
  12.   
  13. 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
  14.   
  15. 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
  16.   
  17. 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
  18.   
  19. 如果Type(x)是String,Number或Symbol而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  20.   
  21. 如果Type(x)是Object而Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
  22.   
  23. 返回false。
  24.   

在你的情况下会发生什么:

{
     valueOf: function(){
         return 1;
     }
}

但是比较例如:

这样的对象
true == {valueOf(){return 1;}} // it returns true
你会得到:

magicVar === true; // it returns false
false

这很简单===,操作数的类型不同,if (magicVar) console.log("???"); // it prints "???" 运算符检查操作数是否具有相同的类型和值。

magicVar

正如所有其他人的回答都说Boolean这里是true上下文并被强制转移到react-native-device

答案 1 :(得分:2)

magicVar作为值。从某种意义上说,它不是空的,它不是空的或未定义的。因此,任何非空值都是真值。但此值 等于为真?不可以。布尔值不是真的值。

总结:

magicVar == true || magicVar === true; // returns false
Boolean(magicVar); // returns true

答案 2 :(得分:1)

这里要理解的概念是真实和虚假布尔值之间的真实和假值之间的区别。请参阅here for truthyhere for falsy

长话短说,如果表达式是真实的,则会if条件通过,而magicVarfunction(真实的)。

答案 3 :(得分:0)

magicVar不等于true。 它等于Math.sin函数。

因此,在if语句中,它被评估为truthy值(它被定义并且不计算为虚假值)。

http://www.sitepoint.com/javascript-truthy-falsy/

答案 4 :(得分:0)

比较function Math.sinboolean常量返回false,因为此变量具有不同的类型。 但是当你将not-bool变量放到if条件时:例如if (Math.sin)...if (window)...如果变量不等于null,则返回true。