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

作者: danny8376 (釣到一隻猴子@_@)   2014-06-04 21:01:00
※ 引述《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大師喔^.<
:
作者: s25g5d4 (function(){})()   2014-06-04 21:10:00
推推
作者: cyclone350 (老子我最神)   2014-06-04 23:38:00
推~ 大概了解了~ 就是不求甚解!! 一切都是規定,沒有合不合理的問題 !! 所以也不用做邏輯推倒 !

Links booklink

Contact Us: admin [ a t ] ucptt.com