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