今天看,相等equal(loose equal涉及类型转换),然后研究到+运算符,研究到Number转型函数。
提出问题
Number(o)对o到底做了什么?
解答问题
首先扩展一下,如果没有o,Number()返回0
如果o是布尔类型,false和true分别转换为0,1;
如果o是数字,就原封不动返回数字。
如果o是字符串,会按照特殊规则进行解析????到底什么规则?主要是应对进制。
Number("") // 0
Number("0x11") // 17 十六进制
Number("0b11") // 3 二进制
Number("0o11") // 9 8进制
Number("foo") // NaN
Number("100a") // NaN
如果o是null,会返回0,这是javascript设计者这么设计的原因。仿照Java中的null.
如果o是undefined,会返回NaN。因为undefined是一个表示"无"的原始值,转为数值时为NaN。语言设计之初就是这么设计的。引申出一个问题:为什么要设计undefined。之所以设计出undefined是因为担心①null值会被默默进行数据转换 ②null值是作为一个对象类型,作者觉得表示无应该有一个原始值。
如果o是对象,则看它是否有valueOf属性,如果有就调用o.valueOf(),(不管有没有0.toString())。如果没有valueOf,就看有没有toString,如果有toString就返回o.toString()。如果没有o.toString方法就返回NaN.
发现一个很有意思的现象
问一个问题,为什么如果传入Number类型转换函数传入undefined作为参数返回NaN.
我猜想,这是因为传入undefined参数和不传入参数,函数体内的arguments是不一样的。
那为什么Number(undefined)不被转换成0呢,那就是它内部自己实现的问题了。
为什么Number(null)变为0?
从阮一峰老师的博客中获得了解答。
最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。
根据C语言的传统,null被设计成可以自动转为0。
参考文献
- 《javascript高级程序设计》 3.5操作符章节
- Number
- Equality comparisons and sameness