為什麼 ++[[]][+[]]+[+[]] = 10 ?(javascript)

來源:互聯網
上載者:User

首先,問這個問題的人是個天才,他怎麼會遇到這樣的一個問題。其次,回答這個問題的人更是一個天才,我難以想象他會回答這個問題,更難以想象的是,他的回答是如此的詳細和豐富和完整,真正稱得上誨人不倦。

既然遇到了這個問題,我們不妨也跟著提高一下。

這是一個 Javascript 語言題目,一個完全有效等式,不信自己可以試一下,下面看看高人的題解:

++[[]][+[]]+[+[]]

 

如果把這段運算式拆分開來,它相等於:

?
++[[]][+[]] +[+[]]

在 JavaScript 裡,+[] === 0 是完全正確的。 + 會把一些字元轉化成數字,在這裡,這個式子會變成 +”" 或 0。

因此,我們可以簡化一下(++ 比 + 有更高的優先順序):

?
++[[]][0] +[0]

因為 [[]][0] 的意思是:擷取 [[]] 的第一個元素,這就得出了下面的結果:

  • [[]][0] 返回內部數組 ([])。根據語言規範,我們說 [[]][0] === [] 是不正確的,但讓我們把這個內部數組稱作 A,以避免錯誤的寫法。
  • ++[[]][0] == A + 1, 因為 ++ 的意思是“加一”。
  • ++[[]][0] === + (A + 1);換句話說,你得到的永遠是個數值( +1 並不一定得到的是個數值,但 ++ 一定是)。

同樣,我們可以把這一堆代碼簡化的更清晰。讓我們把 A 換回成 [] :

?
+([] + 1) +[0]

在 JavaScript 裡,這也是正確的:[] + 1 === “1″,因為 [] == “” (這相當於一個空的數組的內部元素串連),於是:

  • +([] + 1) === + (“” + 1),並且
  • +(“” + 1) === + (“1″),並且
  • +(“1″) === 1

讓我們再次簡化一下:

?
1 +[0]

同樣,在 Javascript 裡,這是正確的:[0] == “0″,因為這是相當於一個有一個元素的數組的內部元素的串連。各元素會使用,分隔。當只有一個元素時,你可以推論出這個過程的結果就是它自身的第一個元素。

所以,最終我們得到(數字 + 字串 = 字串):

?
1 +"0"=== "10" // 耶!

如果你想知道更詳細的資訊,請訪問這裡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.