javascript
javascript:可以运行的噪音
為我的博客做了一個(gè)很有 geek 風(fēng)格的關(guān)于頁(yè)面。
運(yùn)行下面 javascript 代碼,可以看到我的信息。
?
(+[[]+(1<<1<<1<<1)+(1^1<<1)+(1<<1>>1)+(-~1<<1<<1)+(1.1>>1.1)+(11>>>1)])[[(!!/-/+{})[111^111]+[[]+{}][!1&.1][1|1>>1|1]]+([111/[]+[]][+(1>1)][([]+{})[11-1>>1]+[[],[]+{}+[]][[]+1][1]+(/^/[1]+[])[1|1>>1|1]+[{},1e1,!{}+[]][1+1][1<<1^1]+(11/!{}+{})[~1+1e1+~1]+[!!{}+{}][[]&111][1&1]+(/^/[111]+[])[11^11]+[{},[{}]+{},1][1+[]][11-~1+11>>1]+(!!1+{})[1&1>>1]+([]+{1:1}+[])[1|1]+[[]+!!1][111>>>111][1<<1>>1]]+[])[([]+![111])[1|1<<1|1]+[/=/,[]+[][11]][1|[]][1>>1]+([{}]+{})[1+!![1]]+[1,!1+/~/][1%11][1^1<<1]+(111/[]+{})[~1+1e1+~1]+[!!/-/+/-/][111%111][+!!1]]((~1+1e1+1)+((!1&.1)==([]+/-/[(!![111]+{})[1^1]+(!![1]+[])[1<<1^1]+(!{}+{})[1^1<<1]+(!![1]+/-/)[+(1>1)]])[+(1>1)]),1-~1<<1)](~1-~1e1<<1<<1)+":"+(([]===[])+/-/)[5]+(([]===[])+/-/)[5]+(+[[]+(1e1>>1)+(~1+1e1+~1)+(!1&.1)+(111%11)+(1+1<<1)+(1<<1^11>>1)+(1<<1<<1)+(~1+1e1+1)+(+(1>1))+(+[])+(~1-1+11)+(-~1<<1<<1)+(1-~1<<1)+(~1+1e1)])[[(!!/-/+[])[11&[]]+[[]+{11:11}+[]][111>>111][1+[]]]+([11/!1+/1/][1&1>>1][([{}]+{})[1e1>>1|1]+[[],[]+{111:111}+[]][1|1][111%11]+([]+[][11])[1<<1>>1]+[{},1e1,!/~/+{}][1<<1^1>>1][1<<1^1]+([]+11/!{})[~1+1e1+~1]+[!![111]+[]][1%1][1&1]+([]+[][111])[.1^!1]+[{},[]+{},1][111%11][11-~1+11>>1]+([]+!!1)[111>>>111]+([]+{}+[])[[]+1]+[!!1+[]][1^1][111%11]]+[])[(!1+{})[1^1<<1]+[/=/,[]+/^/[11]][1|[]][11.11>>11.11]+([]+{}+[])[~~(1.1+1.1)]+[1,!{}+/~/][1][1|1<<1]+(1/!{}+[])[~1+1e1+~1]+[!![1]+{}][111.111>>111.111][1+[]]]((11^1<<1)+((1>>1)==([]+/-/[(!!/-/+/-/)[+(111>111)]+(!![11]+[])[1-~1]+(![11]+{})[1|1<<1|1]+(!!{}+[])[11%11]])[111.111>>111.111]),11+1>>1)](~1-~1e1<<1<<1)+"."+(+[[]+([]+1)+(1-~1<<1)+(1+1<<1)+(1|1<<1)+(1<<1<<1<<1)])[[(!!1+{})[!1&.1]+[[]+{}+[]][1&[]][1+[]]]+([11/[]+{}][+(111>111)][([{}]+[{}])[1e1>>1]+[[],[]+{}][[]+1][+!!1]+(/^/[111]+/&/)[1&1]+[{},1e1,!1+[]][1<<1][1^1<<1]+(111/!{}+/1/)[~1+1e1+~1]+[!!/-/+[]][11>>11][1|1]+([][1]+/&/)[1.1>>1.1]+[{},[{}]+{},1][~~1][1+1e1+1]+([]+!!1)[1^1]+([]+{})[1&1]+[!!1+{}][!1&.1][1|[]]]+[])[([]+!1)[1|1<<1|1]+[/=/,[]+/^/[11]][111%11][11.11>>11.11]+([{}]+[{}])[~~(1.1+1.1)]+[1,[]+!/~/][1|1>>1|1][1^1<<1]+([]+11/[])[11+1>>1]+[!!/-/+{}][+(1<1)][~~1]]((1e1-1)+((+[])==([]+/-/[(!!1+[])[!1&.1]+(!!/-/+/-/)[1|1<<1|1]+(!1+{})[1<<1^1]+(!![1]+/-/)[11>>11]])[111^111]),-~11>>1)](~1-~1e1<<1<<1)如何實(shí)現(xiàn)的呢?
@OKter 說(shuō)是 ASCII 碼拼接。到底是不是呢?
第一步
先來(lái)個(gè)簡(jiǎn)單的,就以?justjavac?為例吧。首先我們要輸出?j。
下面這段代碼可以輸出?j:
(1+{})[4]解釋:代碼?1+{}?的結(jié)果是?"1[object Object]", 顯然,我們得到了一個(gè)包含 j 的字符串。但為什么會(huì)如此奇怪呢?畢竟我們都期望?1+{}?的結(jié)果應(yīng)該是 1。
對(duì)象加法
有下面這樣的一個(gè)加法操作。
value1 + value2在計(jì)算這個(gè)表達(dá)式時(shí),內(nèi)部的操作步驟是這樣的 (§11.6.1):
將兩個(gè)操作數(shù)轉(zhuǎn)換為原始值 (以下是數(shù)學(xué)表示法的偽代碼,不是可以運(yùn)行的 JavaScript 代碼):
prim1 := ToPrimitive(value1)prim2 := ToPrimitive(value2)PreferredType?被省略,因此?Date?類(lèi)型的值采用?String,其他類(lèi)型的值采用?Number。
如果 prim1 或者 prim2 中的任意一個(gè)為字符串,則將另外一個(gè)也轉(zhuǎn)換成字符串,然后返回兩個(gè)字符串連接操作后的結(jié)果。
否則,將 prim1 和 prim2 都轉(zhuǎn)換為數(shù)字類(lèi)型,返回他們的和。
更多詳細(xì)內(nèi)容參考
- JavaScript中,{}+{}等于多少?
?
由于字符串可以當(dāng)作數(shù)組一樣取里面的元素,于是?(1+{})[4]?就得到了 j。
第二步
既然我們得到了 j,那下一步就是 u 了。我們還是按照這個(gè)思路,哪個(gè)字符串里面還有 u 呢? 在 javascript 中確實(shí)有這么一個(gè)特殊的值,含有 u: "undefined",思來(lái)想去,可以使用這段代碼:
/1/[1]+[]分開(kāi)解釋:
/1/?是一個(gè)正在表達(dá)式
當(dāng)他后面跟上 [] 時(shí),被強(qiáng)制轉(zhuǎn)換成了數(shù)組,然后去取里面的元素(第二個(gè)元素),得到的結(jié)果是 undefined(注意:是 undefined 值,不是字符串)
把 undefined 轉(zhuǎn)換成字符串,在這里我們把它和數(shù)組相加。
呵呵,上面使用正在表達(dá)式?/1/?有點(diǎn)兒賣(mài)弄的嫌疑,其實(shí)用?1[1]?就夠了。 為了更有 geek 感,可以多出現(xiàn) 0 和 1。通過(guò)?/1+/[+0]+[+1]?我們可以得到字符串 "undefined1"。
使用數(shù)組操作符把我們想要的 u 提取出來(lái),?(/1+/[+0]+[+1])[0]。
現(xiàn)在我們已經(jīng)得到了字符串 "ju" 了。按照這種方法,我們可以得到其他的字符串。沒(méi)有做不到的,只有想不到的。
問(wèn)題來(lái)了
用這種方法能拼出所有的字符嗎??@長(zhǎng)夜 則提出了更深的問(wèn)題: “可以拼中文嗎?”
@TODO 待續(xù)……
大功告成
當(dāng)我們得到了所有的字符串,就可以使用 + 號(hào)把他們連接起來(lái)。 你以為這就完了嗎?當(dāng)然遠(yuǎn)遠(yuǎn)沒(méi)有,我們應(yīng)該讓我們的代碼更 Cool,更有 geek 范。
相關(guān)閱讀:
- JavaScript 的怪癖 1:隱式類(lèi)型轉(zhuǎn)換
- 為什么 ++[[]][+[]]+[+[]] = 10?
轉(zhuǎn)載于:https://www.cnblogs.com/lanzhi/archive/2013/06/01/6468090.html
總結(jié)
以上是生活随笔為你收集整理的javascript:可以运行的噪音的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA中的方法和构造方法有什么区别
- 下一篇: 使用JScript设置SVN客户端hoo