[英]Javascript true/false function
我是JavaScript新手,我發現了一些我無法理解的奇怪行為:
var magicVar = Math.sin;
magicVar == true; // it returns false
magicVar === true; // it returns false
if (magicVar) console.log("???"); // it prints "???"
怎么了?
謝謝。
var magicVar = Math.sin;
從這里開始, magicVar
是對Math.sin
函數的引用,它實際上是一個Object
(參見MDN上的函數 )
Function構造函數創建一個新的Function對象。 在JavaScript中,每個函數實際上都是一個Function對象。
magicVar == true; // it returns false
這是false
:如果您使用==
運算符將Object
類型的操作數與Boolean
類型的操作數進行比較,則從MDN上的Equality比較和相同性中總是得到false
( 使用==表查看Loose equality )。
[編輯]正如Bergi在評論中指出的那樣,實際上在某些情況下你可以將對象與布爾值相比松散地返回true。
幕后實際發生的是應用了ES6§7.2.12中描述的比較算法。
7.2.12抽象平等比較
比較x == y,其中x和y是值,產生真或假。 這樣的比較如下進行:
- 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。
在你的情況下會發生什么:
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
但比較一個對象,例如:
{
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
. magicVar
是真的。 從某種意義上說,它不是空的,它不是空的或未定義的。 因此,任何非空值都是真值。 to true ? 但這個值是否 真? 不,它作為一個布爾值不是真的值。
總結一下:
magicVar == true || magicVar === true; // returns false
Boolean(magicVar); // returns true
這里要理解的概念是真實和錯誤的布爾值與真實和虛假布爾值之間的區別。 在這里看到truthy和這里的falsy
長話短說, if
表達式是真實的, if
條件通過,而magicVar
是一個function
(truthy)。
magicVar不等於true。 它等於Math.sin函數。
因此,在if語句中,它被評估為truthy值(它被定義並且不計算為虛假值)。
比較function Math.sin
與boolean
常量返回false
,因為這個變量有不同的類型。 但是當你將not-bool變量放入if
條件時:例如if (Math.sin)...
或if (window)...
如果變量不等於null,則返回true。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.