W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
首先,問“這個(gè)問題(英文)”的人是個(gè)天才,他怎么會(huì)遇到這樣的一個(gè)問題。 其次,回答這個(gè)問題的人更是一個(gè)天才,我難以想象他會(huì)回答這個(gè)問題,更難以想象的是,他的回答是如此的詳細(xì)和豐富和完整,真正稱得上誨人不倦。
既然遇到了這個(gè)問題,我們不妨也跟著提高一下。
這是一個(gè)Javascript 語言題目,一個(gè)完全有效的等式,不信自己可以試一下,下面看看高人的題解:
++[[]][+[]]+[+[]]
如果把這段表達(dá)式拆分開來,它相等于:
++[[]][+[]]
+
[+[]]
在 JavaScript 里,+[] === 0
是完全正確的。 +
會(huì)把一些字符轉(zhuǎn)化成數(shù)字,在這里,這個(gè)式子會(huì)變成 +""
或 0
。
因此,我們可以簡化一下(++
比 +
有更高的優(yōu)先級(jí)):
++[[]][0]
+
[0]
因?yàn)?[[]][0]
的意思是:獲取 [[]]
的第一個(gè)元素,這就得出了下面的結(jié)果:
[[]][0]
返回內(nèi)部數(shù)組 ([]
)。根據(jù)語言規(guī)范,我們說 [[]][0] === []
是不正確的,但讓我們把這個(gè)內(nèi)部數(shù)組稱作 A,以避免錯(cuò)誤的寫法。++[[]][0] == A + 1
, 因?yàn)?++
的意思是”加一”。++[[]][0] === +(A + 1)
;換句話說,你得到的永遠(yuǎn)是個(gè)數(shù)值( +1
并不一定得到的是個(gè)數(shù)值,但 ++
一定是)。同樣,我們可以把這一堆代碼簡化的更清晰。讓我們把 A 換回成 []
:
+([] + 1)
+
[0]
在 JavaScript 里,這也是正確的:[] + 1 === "1"
,因?yàn)?[] == ""
(這相當(dāng)于一個(gè)空的數(shù)組的內(nèi)部元素連接),于是:
+([] + 1) === +("” + 1),并且
+("” + 1) === +("1"),并且
+("1") === 1
讓我們?cè)俅魏喕幌拢?/p>
1
+
[0]
同樣,在 Javascript 里,這是正確的:[0] == "0"
,因?yàn)檫@是相當(dāng)于一個(gè)有一個(gè)元素的數(shù)組的內(nèi)部元素的連接。
各元素會(huì)使用,分隔。
當(dāng)只有一個(gè)元素時(shí),你可以推論出這個(gè)過程的結(jié)果就是它自身的第一個(gè)元素。
所以,最終我們得到 (數(shù)字 + 字符串 = 字符串):
1
+
"0"
=== "10" // 耶!
如果你想知道更詳細(xì)的信息,請(qǐng)?jiān)L問這里(英文)。
本文問轉(zhuǎn)載文章,原文:http://justjavac.com/javascript/2012/05/24/can-you-explain-why-10.html
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: