摘要:說明在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡單的,它并不復(fù)雜,我們先來分解一下這行代碼我們把這一行,分解成了行了。簡單說中的與方法簡單說與引發(fā)的思考
說明
JavaScript在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。
我們來看看這行代碼
(![]+[])[+!![]- -+!![]- -+!![]]+({}+[])[+!![]]+(![]+[])[+!![]- -+!![]- -+!![]]
這行代碼的結(jié)果可能出乎你的意料,看結(jié)果
結(jié)果居然是sos,這就是為什么會給文章這樣一個題目了,這行代碼看上去似乎是亂七八糟的,但是相信你看完這篇文章,一定能自己寫出這樣的代碼來。
解釋相信我,這行代碼是簡單的,它并不復(fù)雜,我們先來分解一下這行代碼
(![]+[])[+!![]- -+!![]- -+!![]] //s + ({}+[])[+!![]] //o + (![]+[])[+!![]- -+!![]- -+!![]] //s
我們把這一行,分解成了3行了。
先看第一行
(![]+[])[+!![]- -+!![]- -+!![]]
這行還能分成兩部分
(![]+[]) [+!![]- -+!![]- -+!![]]
我們繼續(xù)看這分開的兩部分
(![]+[]) 看看這個是什么意思
友情提示:
[ ] 轉(zhuǎn)為布爾值是 true
[ ] 轉(zhuǎn)為字符串是 ""
如果想知道為什么,推薦看看下面的兩篇文章。
簡單說 JavaScript中的tostring( ) 與 valueOf( )方法
簡單說 !![]==true 與 []==true 引發(fā)的思考
![ ] 就是false
(![]+[]) 會轉(zhuǎn)為這個樣子 (false+"") 結(jié)果就是"false",字符串類型的哦!
[+!![]- -+!![]- -+!![]]這個又是什么意思呢?
我們能看見 +!![] 這個東西是什么,居然出現(xiàn)了三次
+!![],!的優(yōu)先級最高,先算 !![ ],!![ ] 是對 [ ]進(jìn)行了布爾值的轉(zhuǎn)換,最后結(jié)果就是true,最后在往前面來個+,就成了+true 這樣,進(jìn)行隱式轉(zhuǎn)換,把true轉(zhuǎn)為數(shù)字,就是1,好了,+!![] 就是 1 的意思,我們用1來替換一下代碼,看看變成了什么樣子[1- -1 - -1],我相信大家都能算出這么簡單的正數(shù) 減 負(fù)數(shù) 減 負(fù)數(shù) 的結(jié)果來,所有最后的結(jié)果是[3]
好的,我們把第一行的這兩個部分放在一起看看 "false"[3],這下明顯了吧!字符串的第3個字符,這樣就有s了
繼續(xù)看第二行
({}+[]])[+!![]]
我們同樣拆成兩部分
({}+[]]) [+!![]]
第一部分 ({}+[])
( )里面的{},不是語法上的花括號,不是語句塊的意思,而是表示了一個空對象,這里相加的時候會調(diào)用對象的toString()方法,所以它會轉(zhuǎn)為"[object Object]",字符串類型的哦!
[ ],它同樣也會調(diào)用toString()方法,所以[ ],會轉(zhuǎn)為"",也就是一個空字符串。
這兩個結(jié)果放在一起就是"[object Object]"+"" ,最后結(jié)果是"[object Object]"。
第二部分 [+!![]]
上面我們已經(jīng)知道+!![] 是 1 的意思,所以最后的結(jié)果就是[1]
好的,我們把第二行的這兩個部分放在一起看看"[object Object]"[1],這樣我們就看的很清楚了,o也有了
最后的第三行,和第一行一模一樣,好的我們用 + ,把這三行的結(jié)果拼接起來就是 "sos" 了。
總結(jié)最后用張圖總結(jié)一下
相信現(xiàn)在,你應(yīng)該是理解上面的代碼了,寫這個代碼,也主要是想理解理解隱式轉(zhuǎn)換,題目是開玩笑的,希望大家永遠(yuǎn)不會真的遇到需要這樣的代碼的關(guān)鍵時刻。
最后推薦兩篇相關(guān)的文章,希望對大家有所幫助。
簡單說 JavaScript中的tostring( ) 與 valueOf( )方法
簡單說 !![]==true 與 []==true 引發(fā)的思考
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/51453.html
摘要:說明在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡單的,它并不復(fù)雜,我們先來分解一下這行代碼我們把這一行,分解成了行了。簡單說中的與方法簡單說與引發(fā)的思考 說明 JavaScript在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。 我們來看看這行代碼 (![]+[])[+!![]- -+!!...
摘要:說明在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。解釋相信我,這行代碼是簡單的,它并不復(fù)雜,我們先來分解一下這行代碼我們把這一行,分解成了行了。簡單說中的與方法簡單說與引發(fā)的思考 說明 JavaScript在比較的時候,會進(jìn)行隱式轉(zhuǎn)換,你如果對隱式轉(zhuǎn)換不是特別熟悉,結(jié)果往往出乎你的意料。 我們來看看這行代碼 (![]+[])[+!![]- -+!!...
摘要:簡單說中的與方法我們一句一句的看結(jié)果是邏輯非,會將操作數(shù)的布爾值求反,而就是類型轉(zhuǎn)換,將對應(yīng)的類型轉(zhuǎn)換為型所以我們看一看,一次求反返回的就是,再求反返回的就是。原始值不可變更的值,包括布爾值數(shù)字和字符串。 說明 直接說出問題 !![] == true //結(jié)果是true [] == true //結(jié)果是false ![] == [] //結(jié)果是true 為什么會出現(xiàn)這種情...
摘要:簡單說中的與方法我們一句一句的看結(jié)果是邏輯非,會將操作數(shù)的布爾值求反,而就是類型轉(zhuǎn)換,將對應(yīng)的類型轉(zhuǎn)換為型所以我們看一看,一次求反返回的就是,再求反返回的就是。原始值不可變更的值,包括布爾值數(shù)字和字符串。 說明 直接說出問題 !![] == true //結(jié)果是true [] == true //結(jié)果是false ![] == [] //結(jié)果是true 為什么會出現(xiàn)這種情...
閱讀 3721·2021-11-23 09:51
閱讀 1384·2021-11-10 14:35
閱讀 4023·2021-09-22 15:01
閱讀 1292·2021-08-19 11:12
閱讀 392·2019-08-30 15:53
閱讀 1702·2019-08-29 13:04
閱讀 3439·2019-08-29 12:52
閱讀 3069·2019-08-23 16:14