我是JavaScript的新手,我发现了一些我无法理解的奇怪行为:
var magicVar = Math.sin;
magicVar == true; // it returns false
magicVar === true; // it returns false
if (magicVar) console.log("???"); // it prints "???"
发生了什么事?
谢谢。
答案 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或 假。这样的比较如下进行:
- ReturnIfAbrupt(X)。
- ReturnIfAbrupt(Y)。
- 如果Type(x)与Type(y)相同,则返回执行严格等式比较的结果x === y。
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null,则返回true。
- 如果Type(x)为Number且Type(y)为String,则返回比较结果x == ToNumber(y)。
- 如果Type(x)为String且Type(y)为Number,则返回比较结果ToNumber(x)== y。
- 如果Type(x)是布尔值,则返回比较结果ToNumber(x)== y。
- 如果Type(y)是布尔值,则返回比较结果x == ToNumber(y)。
- 如果Type(x)是String,Number或Symbol而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
- 如果Type(x)是Object而Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
- 返回false。
醇>
在你的情况下会发生什么:
{
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 truthy和here for falsy
长话短说,如果表达式是真实的,则会if
条件通过,而magicVar
是function
(真实的)。
答案 3 :(得分:0)
magicVar不等于true。 它等于Math.sin函数。
因此,在if语句中,它被评估为truthy值(它被定义并且不计算为虚假值)。
答案 4 :(得分:0)
比较function Math.sin
与boolean
常量返回false
,因为此变量具有不同的类型。
但是当你将not-bool变量放到if
条件时:例如if (Math.sin)...
或if (window)...
如果变量不等于null,则返回true。