红宝书之数值转换number()、parseInt()、pars
数值转换的特点
有三个函数可以把非数值转换为数值:
(1)Number(),可以作用于任何数据类型
(2)parseInt(),将字符串转为整数
(3)parseFloat(),将字符串转为浮点数
number() 转换规则:
- 如果是Boolean值,true和false将分别被转换为1和0
2.如果是数字值,只是简单的传入和返回
3.如果是null值,返回0
4.如果是undefined,返回NaN
5.如果是字符串,遵循一定的规则
字符串转换为number的规则:
1.如果字符串中只包含了数字,(包括前面有+-符号的情况),就将其转换为十进制的数值。如“1”转为1,“123”转为123,而“011”会转换为11。因为前置的0会被忽略。
2.如果字符串中包含有效的浮点数,将会转换为对应的浮点数值,如“0.15”同样会忽略前置0。
3.如果字符中包含有效的十六进制格式,将其转换为相同大小的十进制整数值,如“0xf”转为15。
4.空字符串转为0。
5.如果字符串包含上述格式之外的字符,就转为NaN。
6.如果是对象,则调用对象的valueOf()方法。再次依照前面的规则转换返回的字符串值。如果转换结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
这些规繁杂难记,依然来举例说明:
let num1 = Number('') // 0 空字符串转为0
let num2 = Number('123') // 123
let num3 = Number('true') // NaN 字符串被转换为NaN,是因为其中不包含任何有意义的数字值
let num4 = Number(true) // 1 布尔值true会被转为1
let num5 = Number('false') // NaN 字符串被转换为NaN,是因为其中不包含任何有意义的数字值
let num6 = Number(false) // 0 布尔值false会被转为0
let num7 = Number('0000012') // 12 前置的0会被忽略
let num8 = Number('Hello') // NaN 字符串被转换为NaN,是因为其中不包含任何有意义的数字值
let num9 = Number(null) // 0 如果是null转为0
let num10 = Number(undefined) // NaN 如果是undefined转为NaN
let num11 = Number("000.150") // 0.15 转为对应的浮点数, 忽略前置0
let num12 = Number("0xf") // 15 十六进制转为十进制整数值
let num13 = Number({}) // NaN
因为Number()函数在转换字符串是复杂而且不合理,所以在处理整数的时候常用parseInt() 函数。
parseInt()转换字符串的规则
1.忽略前面的空格,直到找到第一个非空格字符;
2.如果第一个字符不是数字或负号,会返回NaN,所以空字符串会返回NaN,Number()是返回0;
3.如果第一个字符是数字字符,会继续解析第二个字符,直到解析完毕,或者遇到一个非数字字符;如“123red”会被转换为123,非字符会被完全忽略,“22.22”会被转换为22,因为 . 不是一个有效的数字字符。
4.可以将八进制,十六进制转换为十进制。
let s = parseInt(' e123'); // NaN 忽略空格找到第一个非空格字符,如果不是负号和数字,就返回NaN.
let s1 = parseInt(' -e123'); // NaN 第一个字符是负号,第二个字符不是数字,返回NaN
let s2 = parseInt(' -123'); // -123 忽略空格,返回数值
let s3 = parseInt(' -1 23'); // -1 遇到空格就不继续
let s4 = parseInt(' -1e23'); // -1 遇到非空格非数字不继续
let s5 = parseInt(''); // NaN 空字符串返回NaN
let s6 = parseInt('0e1'); // 0 遇到非数字不继续
let s7 = parseInt(' -123e'); // -123 忽略空格,遇到非数字不继续
let s8 = parseInt('101'); // 101 解析数字
let s9 = parseInt('abc123'); // NaN 非空格非数字返回NaN
let s10 = parseInt('11.1'); // 11 小数点 不是有效是数字字符
let s11 = parseInt('070'); // 70 忽略前置0解析数字
let s12 = parseInt('0xf'); // 15 十六进制转换为十进制整数
parseFloat()转换规则
1.也是从第一个字符开始解析;
2.一直解析到字符串末尾,或直到遇到一个无效的浮点数字符,如第一个小数点是有效的,第二个是无效的;
3.十六进制格式的字符串会被转换为0;
4.始终会忽略前置0;
5.直解析十进制;
6.如果小数点后面是0或者没有小数点,会返回整数。
let s1 = parseFloat('1234blue') // 1234 直接忽略blue转为整数
let s2 = parseFloat('0xA') // 0 只解析十进制,其他进制全都返回0
let s3 = parseFloat('22.5') //22.5 转换为数值
let s4 = parseFloat('22.54.25') //22.54 只保留一个小数点
let s5 = parseFloat('0908.32') //908.32 忽略前置0
let s6 = parseFloat('3.125e8') //312500000 识别e
let s7 = parseFloat('45.0') //45 没有小数点或者小数点后面为0,转为整数