簡體   English   中英

如果([] == false)為真,為什么([] || 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

來自ECMA-262 5.1 (第83頁):

如果ToBoolean(lval)為true,則返回lval

[] || false; // []

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM