摘要:本文將介紹一段使用隱式類型轉換輸出的代碼,并講解具體的轉換過程。代碼轉換過程我們分四部分講解具體的轉換過程,一個空數組,緊跟在數組后面的的語義應該是表示屬性操作,類似于中的作用,而不是表示數組。
本文將介紹一段使用JavaScript隱式類型轉換輸出"nb"的代碼,并講解具體的轉換過程。
預備知識請先閱讀文章ECMAScript7規范中的ToPrimitive抽象操作。
代碼([][[]]+[])[+!![]]+([]+{})[!+[]+!![]] // "nb"轉換過程
我們分四部分講解具體的轉換過程:
([][[]]+[])
[+!![]]
([]+{})
[!+[]+!![]]
([][[]]+[])[],一個空數組;
[[]],緊跟在數組后面的[的語義應該是表示屬性操作,類似于obj[key]中[]的作用,而不是表示數組。這個里面,既然外層的[]表示獲取屬性的運算符,里面的[]肯定就表示key了。因為key是原始數據類型,所以會調用ToPrimitive抽象操作把[]轉化為原始數據類型,也就是空字符串"",所以上面兩個結合起來就是:
var a = [] var b = [] a[b] // => a[""] => undefined
+,相加操作;
[],空對象,和上面的步驟結合起來就是:
undefined + []
相加操作會把操作符兩邊的操作數通過ToPrimitive抽象操作轉化為原始數據類型,也就是[]會變為"":
undefined + ""
相加操作的抽象步驟中,如果有一個操作數是字符串,會調用ToString抽象操作把兩個操作數都轉化為字符串類型,也就是:
undefined + "" // => "undefined" + "" => "undefined"
綜上,([][[]]+[])的結果就是字符串"undefined"。
[+!![]]!![],表示把一個數據轉化為布爾類型,因為[]是一個真值,所以!![]的結果是true;
+!![],表示把前面的結果轉化為數字類型,也就是+true,true轉化為數字是1,所以+!![]的結果是1;
[+!![]],也就是[1],結合第一部分([][[]]+[])的結果:
([][[]]+[])[+!![]] // => "undefined"[1] => 也就是獲取字符串"undefined"的第二個字符,也就是"n" => "n"([]+{})
相加操作會調用ToPrimitive抽象操作把操作符兩邊的數據轉化為原始數據類型,也就是:
([]+{}) // => "" + "[object Object]" // => "[object Object]"[!+[]+!![]]
+[],把數組轉化為數字:
+[] // => +"" => 0
!+[],也就是!0:true;
!![],true;
!+[]+!![],也就是true + true,又是相加操作,因為操作符兩邊都是布爾類型,所以會轉化為數字類型,也就是1 + 1,也就是2;
第三部分和第四部分的結果結合起來就是:
([]+{})[!+[]+!![]] // => "[object Object]"[2] => 也就是取字符串"[object Object]"的第三個字符,也就是"b" => "b"
第一二部分和第三四部分結合起來的結果就是:
([][[]]+[])[+!![]]+([]+{})[!+[]+!![]] // => "n" + "b" => "nb"總結
希望大家看的開心!如果本文有什么錯誤或者不嚴謹的地方,歡迎在評論區留言。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97601.html
本篇文章主要是講述在JavaScript中判斷兩個值相等,不要認為很簡單,要注意的是在JavaScript中存在4種不同的相等邏輯。 ECMAScript 是 JavaScript 的語言規范,在ECMAScript 規范中存在四種相等算法,如下圖所示: 上圖中每個依次寫下來,很多前端應該熟悉嚴格相等和非嚴格相等,但對于同值零和同值卻不熟悉,現在就依次下面四種方法。 同值 同值零 非...
要是別人問您:如何讓 x 等于 1 且讓 x 等于 2 且讓 x 等于 3 的等式成立? 咋地,知道如何實現?想罵人有不 現在我們一起來分解思路: 我們先來講講寬松相等== 和嚴格相等 ===,這兩個都能用來判斷兩個值是否相等,但們明確上文提到的等于指的是哪一種,二者的區別看下: (1) 這兩個基礎直接的區別: (1.1) 不同類型間比較,== 比較轉化成同一類型后的值看值是否相等,...
摘要:為了避免某些場景下的意外,甚至推崇直接使用來代替。使用了運算符的一些規則,發生了類型轉換。按照以下規則轉換被傳遞參數直接返回直接返回直接返回直接返回直接返回返回一個對象的默認值。 前言 類型轉換在各個語言中都存在,而在 JavaScript 中由于缺乏對其的了解而不慎在使用中經常造成bug被人詬病。為了避免某些場景下的意外,甚至推崇直接使用 Strict Equality( === )...
摘要:私有網絡下批量部署多臺云主機本篇目錄摘要摘要拓撲圖拓撲圖操作步驟操作步驟參考文獻參考文獻關鍵詞摘要云主機是構建在云環境的彈性計算資源,是最為核心的服務。私有網絡下批量部署多臺云主機本篇目錄摘要拓撲圖操作步驟參考文獻關鍵詞:UHost,VPC,Subnet摘要云主機是構建在云環境的彈性計算資源,是 UCloud 最為核心的服務。有些服務,如彈性 IP、鏡像、云硬盤等必須與云主機結合后使用,另一...
閱讀 2102·2021-11-19 09:58
閱讀 1701·2021-11-15 11:36
閱讀 2867·2019-08-30 15:54
閱讀 3386·2019-08-29 15:07
閱讀 2759·2019-08-26 11:47
閱讀 2805·2019-08-26 10:11
閱讀 2496·2019-08-23 18:22
閱讀 2744·2019-08-23 17:58