201205210110解析 JavaScript,我真是搞不懂你啊! @ JSDC Taiwan 2012

「 JavaScript,我真是搞不懂你啊!」是 JSDC Taiwan 2012 Lighting Talk 的第一場,下面是官方提供的錄影:

第一個玩這個遊戲的應該是 Wat - A lightning talk by Gary Bernhardt from CodeMash 2012 。更多類似的 Pattern 可參考 wtfjs - a little code blog about that language we love despite giving us so much to hate 。但是現場拿出來講還是娛樂效果十足。

這裡只就當天 Lighting talk 有講到的例子做解釋,相加系列參考 Dr. Axel Rauschmayer - What is {} + {} in JavaScript?

  • > 9999999999999999
    10000000000000000
    

    一定要寫 16 位或超過 16 位數才有此問題,因為 JavaScript Number value 採用 double-precision 64-bit binary format IEEE 754 value ,精準度止於此。

  • > parseInt('08')
    0
    

    0 開頭的字串 parseInt 視為 8 進位, 8 進位不可能出現 8 ,故 parse 到 0 就停止,結果為 0 。

  • > [] + []
    ""
    

    JavaScript 除了 undefined 、 null 、 boolean 、 number 、 string 五個 Primitive type 外都是 Object 。 Object 做二元運算,會先將 Object 轉為 Primitive type 。轉 Primitive type 的方式,除了 Date 物件會先嘗試 toString() 、再試 valueOf() ,其餘物件型態都是先試 valueOf() 、再試 toString() 。如果 valueOf() 、 toString() 回傳結果都不是 Primitive type ,會產生 js error 。

    [].valueOf()[] ,不是 Primitive type ,改用 [].toString() ,吐回 ""

    "" + "" 還是空字串。

  • > [] + {}
    "[object Object]"
    

    [].valueOf()[] ,不是 Primitive type ,改用 [].toString() ,吐回 ""

    ({}).valueOf() 是 Object ,不是 Primitive type ,改用 ({}).toString() 吐回 "[object Object]"

    "" + "[object Object]" 答案是 "[object Object]"

  • > {} + []
    0
    

    JavaScript 將寫在開頭的 {} 視為一個空的 code block ,省略。故這裡剩餘 +[] ,等於 Number([]) ,也就是 Number([].toString()) ,也就是 Number("") ,答案為 0 。

  • > {} + {}
    NaN
    

    JavaScript 將寫在開頭的 {} 視為一個空的 code block ,省略。故這裡剩餘 +{} ,等於 Number({}) ,也就是 Number(({}).toString()) ,也就是 Number("[object Object]") ,答案為 NaN

  • > foo = [0]
    > foo == !foo
    true
    

    任何陣列做 ! 運算,不論內容為何,結果皆是 false ,因為 !true

    == 前面的 foo ,先看 [0].valueOf() 是 [0] ,不是 Primitive type ,改用 [0].toString() ,也就是 [0].join() ,結果為 "0"

    "0" == false 答案為 true 。

  • > bar = NaN
    > bar === bar
    false
    

    任何東西皆不等於 NaN ,有需要請用 isNaN()

  • > 3 > 2 > 1
    false
    

    等同 (3 > 2) > 1 , 也就是 true > 1 ,故 false 。

  • > Math.min() < Math.max()
    false
    

    不傳參數 Math.min() 回傳 Infinity , Math.max() 回傳 -Infinity , Infinity < -Infinity ,故 false 。

很多問題出在 JavaScript 是 Weak type ,這是缺點,但也是優點。

玩不過癮可以繼續挑戰這篇, Zeros in JavaScript

回應
Google 站內搜尋
BloggerAds
累積 | 今日
loading......
    沒有新回應!