[js]Number转型函数学习

今天看,相等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)

问一个问题,为什么如果传入Number类型转换函数传入undefined作为参数返回NaN.
我猜想,这是因为传入undefined参数和不传入参数,函数体内的arguments是不一样的。
那为什么Number(undefined)不被转换成0呢,那就是它内部自己实现的问题了。

为什么Number(null)变为0?

从阮一峰老师的博客中获得了解答。

最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示"无"的值。
根据C语言的传统,null被设计成可以自动转为0。

参考文献

  1. 《javascript高级程序设计》 3.5操作符章节
  2. Number
  3. Equality comparisons and sameness
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容