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