Re: [問題] js型態轉換問題

看板Ajax作者 (釣到一隻猴子@_@)時間10年前 (2014/06/04 21:01), 10年前編輯推噓3(301)
留言4則, 3人參與, 最新討論串3/3 (看更多)
※ 引述《cyclone350 (老子我最神)》之銘言: : 標題: [問題] js型態轉換問題 : 時間: Wed Jun 4 12:28:40 2014 : 大家好,這幾天再看一些 javascript 的東西 : 雖然我頁面的javascript都用的順順的... : 但是有些觀念真的是超級難以理解... : : 舉一個例子... : 在型態轉換這方面... : > 2 + 3 + '4' : 54 : 可以理解成 2 + 3 = 5, 5 + '4' 時 5會被轉成 String '5' : 這沒問題 : 可以想成 number + String 會被轉成 String : 而 true 跟 false 的 boolean 轉換規則 true 代表 1,false 代表 0 : 所以會有以下例子 : >false == 0 : true : >5==true : false : 這也沒問題 : 另外還有一個規則就是"除了0、NaN、''、null、undefinied是假的(false)之外,其它 : 都是真的(true)。" : 這也可以想像... 上面都很正確沒問題 不過當你把轉換跟邏輯比較混在一起就錯了 在EMCA規範裡 這些邏輯比較都有額外的比較規範,並不一定會產生轉型 回底下的東西前先送上EMCAScript規格書OwO http://goo.gl/SGKp01 (http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf) : 不過細節部分就很模糊了... 例如 : >false == 0 : true : 他到底是把 false 轉成 0,還是把 0 轉成 false ? : 是否跟位置有關? 詳見11.9.1&11.9.3 一路會跑到 18.If Type(x) is Boolean,return the result of the comparison ToNumber(x) == y. 而ToNumber(false) => 0 所以是true : 以下就是一個 WTF : > typeof null : 'object' : > 0==null : false 根據11.9.3 20.If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y). ToPrimitive(null) => null 所以 0 != null 更正 null並不是Object... 而是 22. Return false. 一路到最後都不合的回傳false : >1+null : 1 11.6.1 總之最後是1+0 所以你前面認知無誤 : 經過書本或網路上有看過 'object' 做運算或比較會先呼叫 valueof 方法,若沒有 : valueof方法則呼叫 toString 方法 不怎完整,其實不管哪個operator步驟都挺囉嗦的... : > 0==null : false : 所以可能代表 null 不能轉成 0 (透過 valueof 或 toString) 這個比較不存在轉換 : 可是 1+null = 1 : null 又被轉成 0 了........???????? 這裡才是真正轉換 所以被轉成0了 : 以下更 WTF : >null == undefined : true 11.9.3 14. If x is null and y is undefined, return true. 不用懷疑 這等式是強制規範,連轉都不用轉 : >1+null : 1 上面提了 : >1+undefined : NaN 11.6.1&11.6.3 ToNumber(undefined) => NaN 1+NaN => NaN : 到底是怎麼轉的.... : 而且 : > typeof undefined : undefined : >typeof null : object : 那 null == undefined 到底是轉成甚麼鬼東西? 上面說了 這比較根本沒轉,是強制規範 : 在良葛格型態轉換章節最後有提到一句 : "在弱型別語言中,型態轉換往往自動發生,最好還是實際測試了解結果, : 避免不必要的型態轉換而發生誤判或錯誤的運算結果。" : : 意思難道是說 "我根本不知道在型態轉換到底是怎麼轉的,反正測測看就知道了" ? : 並不是要嗆良葛格的意思... 你看看整份EMCAScript規格書 你想遇到問題直接試試如何 還是要背完整份呢(笑 : 但是在型態轉換中 java 語言可以清晰清楚地寫出轉換規則及邏輯 : 而 javascript 卻是說 測測看結果 ? : : 更怪的是這個 : > typeof null; : object : > null instanceof Object; : false 這邊就是奇妙的規範了... 根據8.2&11.4.3 null的type實際上是Null Type 不過typeof的回傳被規範成object 所以結論上,理所當然不是Object的instance 大概只算是偽裝成object (? : 我在看 javascript 書時也常常出現 "這很怪", "這沒規範", "這樣寫在某些地方可以執 : 行" : 而且還把js稱作 "bug叢生的javascript" (by 駕馭javascript的68個具體作法) : : : 雖然我覺得我根本不瞭解js,不過我在web頁面仍然可以寫出可以跑得 js 或 jquery : 我仍然可以套用 jquery UI , 寫 Ajax, 使用 js 做基本客戶端互動介面。 : : 對各位而言,javascript 是一個怎麼樣的語言? : 不知道是我根本沒搞懂js,還是js本身就是一個不想讓人懂的語言? 我是覺得啦 用這這種弱型別的語言就不要管太多太底層的東西 不然他幫你包好好的意義不就消失了? 頂多注意一下別被某些型別轉換整到就好 : 型態轉換有沒有一個具體的邏輯可以來講解? 前附的規範書整本看完你就能成為JS大師喔^.< : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.218.64.133 : ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1401856122.A.9AF.html : 推 GoalBased:不要鑽牛角尖= = 06/04 12:34 : → GoalBased:JS當然也會有一個轉換的標準方式阿 只是沒關心罷了 06/04 12:35 : → mmis1000:ecma 規範裡都有寫啊 06/04 12:40 : 推 ck574b027:NaN != NaN 才叫做 WTF 06/04 17:06 根據11.9.3 只要兩側都數字 任一側出現NaN就一律回傳false : 推 mmis1000:不是一個數字 不等於 不是一個數字,很奇怪嗎? 06/04 17:20 : 推 turtleknight:寫coffeescript阿XD 06/04 18:04 我承認我太閒了XDD 總之真的想搞清楚就看EMCAScript的規範吧 不過真的要寫JS還是別管這些了 除非你打算開發一個JS直譯器www -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.216.102 ※ 文章網址: http://www.ptt.cc/bbs/Ajax/M.1401886865.A.965.html

06/04 21:10, , 1F
推推
06/04 21:10, 1F
※ 編輯: danny8376 (140.115.216.102), 06/04/2014 21:13:39

06/04 23:38, , 2F
推~ 大概了解了~ 就是不求甚解!! 一切都是規定,沒有合
06/04 23:38, 2F

06/04 23:39, , 3F
不合理的問題 !! 所以也不用做邏輯推倒 !
06/04 23:39, 3F

07/22 09:40, , 4F
推導 推倒髒髒
07/22 09:40, 4F
文章代碼(AID): #1JZnYHbb (Ajax)
文章代碼(AID): #1JZnYHbb (Ajax)