※ 引述《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大师喔^.<
: