![](/img/trans.png)
[英]Why does my `if(result !== "false")` return true?
[英]If ([] == false) is true, why does ([] || true) result in []?
剛做了一些測試,我發現這很奇怪:
[] == false
這是有道理的,因為double equal只比較內容而不是類型,並嘗試進行類型強制。 但是如果它的比較內容並且返回true,那意味着[]是假的(如果你做[] == true
你也會得到假),這意味着:
[] || false
應該給予假,但它給[],使其變得真實? 為什么?
另一個例子:
"\n " == 0
給出了真實,但"\\n " || false
"\\n " || false
給出"\\n "
? 有沒有解釋這個或它只是一個奇怪的。
當我在C中嘗試這個時,我們得到:
int x = "\n " == 0;
printf("%d\n", x);
int y = "\n " || 0;
printf("%d\n", y);
輸出:
0
1
這是有道理的,但考慮到C對Javascript的影響,行為是不同的。
“是假的”(即使是強制)也不同於“在布爾上下文中評估為假”。 obj == false
詢問對象是否為布爾值false
,而不是它是否會在布爾上下文中進行求值時進行求值。
您可以使用(!!obj)
在布爾上下文中評估對象。
[] == false; // true
(!![]) == false; // false
"\n " == false; // true
(!!"\n ") == false; // false
類型轉換與falsy和truthy值無關。
什么是真實的,什么是假的是由specs和[]
定義的ToBoolean
函數定義的確是真實的。
另一方面,由於在表達式求值期間發生的類型轉換 , [] == false
返回true
。
類型轉換規則說x == y
如果Type(y)是布爾值,則返回比較結果x == ToNumber(y)。
ToNumber
導致0為false,因此我們留下了[] == 0
的評估。 根據同樣的規則
如果Type(x)是Object而Type(y)是String或Number,則返回比較結果ToPrimitive(x)== y。
ToPrimitive
導致空字符串。 現在我們有"" == 0
。 返回我們的類型轉換規則
如果Type(x)是String並且Type(y)是Number,則返回比較結果ToNumber(x)== y。
ToNumber
導致0為""
因此最終評估為0 == 0
,這是true
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.