1.数值转换
1-1 其他值转换到数值
有三个函数可以将非数值值转换为数值:Number()、parseInt()和parseFloat()。Number()是转型函数,可用于任何数据类型。后两个函数主要用于将字符串转换为数值。此外Symbol类型不能转换为Number类型。
(1)Number()
- 布尔值,true转换为1,false转换为0
- 数值,直接返回
- null,返回0
- undefined返回NaN
- 字符串:
- 包含数值,包括数值字符前面带加、减号的情况,则返回为一个十进制数值。Number('011')返回11
- 浮点值格式则转换为相应的浮点值。Number('1.1')返回1.1
- 空字符串返回0
- 包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值。
- 其他情况,返回NaN
- 对象,调用valueOf()方法,并按照上述规则转换返回的值。如果转换的是NaN,则调用toString()方法,再按照转换字符串的规则转换。
(2)parseInt()
只能得到整数,可以解析为不同进制。 如果第一个字符不是数值字符、加号、减号,parseInt()立即返回NaN。这意味着空字符串也会返回NaN(Number()它返回0)。此外,parseInt()可以传递第二个参数,用于指定底数(进制数)。比如如果知道要解析的值是十六进制,那么可以省略前面的"0x"
let n1 = parseInt(22.5) //22
let n2 = parseInt("1234blue") //1234
let n3 = parseInt("") //NaN
let num0 = parseInt("0xA") //10,解释为十六进制
let num = parseInt("0xAF",16) //175
let num1 = parseInt("AF",16) //175
let num2 = parseInt("AF") //NaN
通过第二个参数,可以极大扩展转换后的结果类型。
(3)parseFloat()
和parseInt()类似,但是可以得到小数(浮点数),此外只能解析为十进制。
let n1 = parseFloat("1234blue") //1234
let n2 = parseFloat("0xA") //0
let n3 = parseFloat(22.5) //22.5
let n4 = parseFloat("22.34.5") //22.34
let n5 = parseFloat("0908.5") //908.5
1-2 其他值转换为字符串
- Null 和 Undefined 类型 ,null 转换为 "null",undefined 转换为 "undefined",
- Boolean 类型,true 转换为 "true",false 转换为 "false"。
- Number 类型的值直接转换,不过那些极小和极大的数字会使用指数形式。
- Symbol 类型的值直接转换,但是只允许显式强制类型转换,使用隐式强制类型转换会产生错误。
- 对普通对象来说,除非自行定义 toString() 方法,否则会调用toString()(Object.prototype.toString())来返回内部属性 [[Class]] 的值,如"[object Object]"。如果对象有自己的 toString() 方法,字符串化时就会调用该方法并使用其返回值。
1-3 其他值转换为布尔值
以下这些是假值(false):
- undefined
- null
- false
- +0、-0 和 NaN
- ""
逻辑上除了以上的就是转换为真值(true)
2.JavaScript的包装类型
在上一章中我们说过,原始值(基本值)是没有属性和方法的,他们是按值存储的。但是他们为什么会有方法呢?比如let str = 'abc123'; str.length //6。这是因为基本类型在调用它的属性和方法时,JS会在后台隐式地将基本类型的值转换为对象。
let name = ly;
name.toUpperCase() //LY
在访问name.toUpperCase()时,JS将'ly'在后台转换成String('ly'),然后再访问其toUpperCase()方法。最后再调用valueOf()方法将其包装类型转换为基本类型。
JavaScript也可以使用Object函数显式地将基本类型转换为包装类型