第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

空數(shù)組似乎同時等于true和false。

空數(shù)組似乎同時等于true和false。

回首憶惘然 2019-07-17 09:58:18
空數(shù)組似乎同時等于true和false。空數(shù)組是真,但它們也等于false。var arr = [];console.log('Array:', arr);if (arr) console.log("It's true!");if (arr == false) console.log("It's false!");if (arr && arr == false) console.log("...what??");我想這是由于等式運算符所操作的隱式轉換。有人能解釋幕后發(fā)生了什么嗎?
查看完整描述

3 回答

?
繁華開滿天機

TA貢獻1816條經(jīng)驗 獲得超4個贊

你在這里測試不同的東西。

if (arr)調用對象(Array是JS中對象的實例)將檢查對象是否存在,并返回true/false。

當你打電話if (arr == false)你比較價值這個物體和原語false價值。在內部,arr.toString()調用,它返回空字符串。"".

這是因為toString調用數(shù)組返回Array.join()空字符串是JavaScript中的假值之一。


查看完整回答
反對 回復 2019-07-17
?
犯罪嫌疑人X

TA貢獻2080條經(jīng)驗 獲得超4個贊

關于這一行:

if (arr == false) console.log("It's false!");

也許這些會有幫助:

console.log(0 == false) // trueconsole.log([] == 0) // trueconsole.log([] == "") // true

我認為正在發(fā)生的是布爾值false被迫0用于與物體(左手邊)進行比較。對象被強制為字符串(空字符串)。然后,空字符串也被脅迫成一個數(shù)字,即零。所以最后的比較是0 == 0,也就是true.

編輯:看見規(guī)范的這一部分有關此操作的詳細信息。

下面是正在發(fā)生的事情,從規(guī)則1開始:

1.如果類型(X)與類型(Y)不同,則轉到步驟14。

下一個適用的規(guī)則是#19:

19.如果類型(Y)是布爾型,則返回比較x=ToNumber(Y)的結果。

結果ToNumber(false)0,我們現(xiàn)在有:

[] == 0

同樣,規(guī)則1告訴我們跳到第14步,但實際適用的下一步是#21:

21.如果Type(X)是Object,Type(Y)是字符串或數(shù)字,則返回比較ToPrimitive(X)=y的結果。

結果ToPrimitive([])是空字符串,所以我們現(xiàn)在有:

"" == 0

同樣,規(guī)則#1告訴我們跳到步驟#14,但實際適用的下一步是#17:

17.如果Type(X)是String,Type(Y)是Number,則返回比較ToNumber(X)=y的結果。

結果ToNumber("")0,這就給我們留下了:

0 == 0

現(xiàn)在,這兩個值都具有相同的類型,因此這些步驟從#1一直持續(xù)到#7,如下所示:

7.如果x是與y相同的數(shù)字值,則返回true。

所以,我們回來true.

簡言之:

ToNumber(ToPrimitive([])) == ToNumber(false)


查看完整回答
反對 回復 2019-07-17
?
呼啦一陣風

TA貢獻1802條經(jīng)驗 獲得超6個贊

解釋為什么ToPrimitive([])回報""對于“為什么”這個問題,有兩種可能的答案是值得考慮的。第一種回答是:“因為規(guī)范上說這就是JavaScript的行為方式?!痹贓S5規(guī)范中,第9.1節(jié),它將ToPrimitive的結果描述為對象的默認值:

對象的默認值是通過調用對象的[DefaultValue]內部方法來檢索的,并傳遞可選的提示PreferredType。

第8.12.8節(jié)描述[[DefaultValue]]方法。此方法以“提示”作為參數(shù),提示可以是字符串,也可以是數(shù)字。若要簡化此事項,請不要使用某些細節(jié),如果提示為字符串,則[[DefaultValue]]返回toString()如果存在并返回原語值,則返回valueOf()..如果提示為數(shù)字,則toString()valueOf()是相反的,所以valueOf()首先調用,如果它是原語,則返回它的值。因此,是否[[DefaultValue]]返回toString()valueOf()取決于對象的指定PreferredType以及這些函數(shù)是否返回原語值。

默認valueOf()對象方法只返回對象本身,這意味著除非類重寫默認方法,valueOf()只返回對象本身。情況就是這樣Array[].valueOf()返回對象[]本身。因為Array對象不是原語,[[DefaultValue]]提示無關:數(shù)組的返回值將是toString().

引用大衛(wèi)弗拉納根JavaScript:權威指南順便說一句,這是一本很棒的書,每個人都應該首先找到這些問題的答案:

此對象到數(shù)字轉換的詳細信息解釋了為什么空數(shù)組轉換為數(shù)字0,以及為什么具有單個元素的數(shù)組也可以轉換為數(shù)字。數(shù)組繼承了返回對象而不是原始值的默認值()方法,因此數(shù)組到數(shù)字的轉換依賴于toString()方法??諗?shù)組轉換為空字符串??兆址D換為數(shù)字0。具有單個元素的數(shù)組將轉換為與一個元素相同的字符串。如果數(shù)組包含單個數(shù)字,則將該數(shù)字轉換為字符串,然后返回到數(shù)字。

對“為什么”問題的第二種回答,除了“因為規(guī)范說”,從設計的角度解釋了為什么行為是有意義的。在這個問題上,我只能猜測。首先,如何將數(shù)組轉換為數(shù)字?我能想到的唯一明智的可能性是將一個空數(shù)組轉換為0,將任何非空數(shù)組轉換為1,但正如韋恩的回答所揭示的,在許多類型的比較中,一個空數(shù)組將被轉換為0。除此之外,很難為Array.value eOf()找到一個合理的原始返回值。因此,人們可能會說,這只是更有意義的Array.valueOf()是默認的,并返回Array本身,導致toString()是ToPrimitive使用的結果。將Array轉換為字符串而不是數(shù)字更有意義。

此外,正如弗拉納根的引語所暗示的那樣,這個設計決策確實允許某些類型的有益行為。例如:

var a = [17], b = 17, c=1;console.log(a==b);      // <= trueconsole.log(a==c);      // <= false

此行為允許您將單個元素數(shù)組與數(shù)字進行比較,并獲得預期的結果。


查看完整回答
反對 回復 2019-07-17
  • 3 回答
  • 0 關注
  • 817 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號