Number类型转换基础问题

Number类型转换问题

最近看到一个问题,Number([]) = ?第一感觉是NaN,但是实力打脸(是基础忘光了).

Number([]) // 0

立马回去翻了红宝书重新压一压涨红的双脸。

红宝书第三版 30页的 第三章基本概念关于Number的转换规则如下。

Number()函数转换规则如下:

转换规则:

  • 如果是Boolean值,true和false将分别转换为1和0。
  • 如果是数字值,只是简单的传入和返回。
  • 如果是null值,返回0。
  • 如果是undefined,返回NaN。
  • 如果是字符串,遵循下列规则:

        1、如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
        
        2、如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
        
        3、如果字符串中包含有效的十六进制格式,例如"0xf",则将其他转换为相同大小的十进制整数值;
        
        4、如果字符串是空的(不包含任何字符),则将其转换为0;
        
        5、如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.

    按照字符串的转换规则列举一下示例:

Number('00011') === 11;//按第一条规则
Number('001.1') === 1.1//按第二条规则
Number("0xf") === 15 //按第三条规则
Number('') === 0;//按第四条规则
Number('a') === NaN;按第五条规则
  • 如果是对象,则隐性调用对象的valueOf()方法,然后依照前面的规则转换返回的值。
  • 如果转换的结果是NaN,则隐性调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

按照对象规则大致自测了一下,

Number([]) === 0;
//[].toString() === '' 所以Number([]) === 0;
Number([1]) === 1;
//[1].toString() === 1 所以Number([1]) === 1;
Number([2]) === 2;
//[2].toString() === 2 所以Number([2]) === 2;
Number([{}]) === NaN;
//[{}].toString() === '[object Object]' 所以Number([{}]) === NaN;
Number([[]]) === 0;
//[[]].toString() === '' 所以Number([[]]) === 0;
Number([1,2,3]) === NaN;

同样的测试了另一个问题。Number([' ']),按书中解释的。非空且非数值均会转换成NaN,' ',空格字符串按规则描述应该是转换成NaN的执行方式才对。但是却打印出0;

Number([' ']) //0;

在Number解析中,' '格其实也是会被忽视,所以Number([' '])也没能和我理解规则中的那样打印出NaN;

Number(['  123']) // 123;
Number(['123   ']) //123

因为Number同样会忽视前置后置无意义空格,这2个例子解释了为什么空格字符串最后也是为0。

很基础的知识,但是可能是因为自己在浮躁的职业生涯中迷失了自己,过于追求上层业务技术栈的提升,反而忘了最底层的东西(知识)。本末倒置了


通过这个事情也揭示了我的很多很多不足。


大神勿喷,知识是一个学习的过程,可以忽视,请别嘲笑。

发表新评论