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