在了解数据类型转换之前,需先弄清楚两点:
- 数据类型是什么?由谁向谁转换?
- 转换的规则是什么?
类型转换又分显式类型转换和隐式类型转换。
显式类型转换是指需我们主动去转换,隐式类型转换是指浏览器内部自动完成转换。
数据类型
最新的ECMAScript标准定义了7种数据类型
原始类型
Boolean、Null、Undefined、Number、String、Symbol(ES6新增)
对象(引用类型)
Object
类型转换
显式类型转换
显式类型转换是指主动调用一些函数进行类型转换
用于类型转换的函数有:
- Number()
- String()
- Boolean()
Number()
原始类型转换的规则:
- 数值:转换后还是原来的值
- 字符串:如果可以被解析为数值,则转换为相应的数值,否则得到NaN。空字符串转为0
- 布尔值:true转成1,false转成0
- undefined:转成NaN
- null:转成 0
对象类型转换的规则:
- 先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤
- 如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤
- 如果toString方法返回的是复合类型的值,则报错
字符串转为整数数值,更常用parseInt():
- 第一个字符不是数字或负号,返回NaN
- 第一个字符是数字或负号,继续解析后面的字符直到遇到非数字字符,返回前面有效数字字符的数值
- 第一个字符是数字符,并且和后面的字符形成有效的整数格式,则返回对应十进制的数值。比如“0xA”为十六进制,结果返回10
字符串转为浮点数值,常用parseFloat():
- 第一个小数点可被解析,后面的小数点则会忽略
- 忽略前导的零
String()
原始类型转换的规则:
- 数值:转为相应的字符串
- 字符串:转换后还是原来的值
- 布尔值:true转为"true",false转为"false"
- undefined:转为"undefined"
- null:转为"null"
对象类型转换的规则:
- 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤
- 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤
- 如果valueOf方法返回的是复合类型的值,则报错
String()与toString():
- 数值、布尔值、对象和字符串都有toString(),而null和undefined没有该方法
- 如果String()里的参数的值为数值、布尔值、对象和字符串,会调用toString()
Boolean()
数据类型 | 转为true | 转为false |
Boolean | true | false |
String | 任意非空字符串 | " "(空字符串) |
Number | 任何非零数字值 | 0和NaN |
Object | 任何对象 | null |
Undefined | undefinded |
隐式类型转换
隐式类型转换是指程序自动完成转换。
进行隐式类型转换的条件有:
- 四则运算
- 判断语句
- typeof
隐式类型转换的规则和显示类型基本一致,只是把转换的过程放在后台进行。
四则运算:
操作符:++ 、--
规则:任何类型转换成数值,再进行加减操作
操作符:+ - * / %
规则:非数值类型调用Number()转换为数值类型,再进行四则运算
特殊情况:当操作符为+,且临近的变量的数据类型为字符串时,左右两边的变量均转换为字符串类型,然后将两个字符串拼接成一个字符串
判断语句:
if语句里的参数变量会转换为Boolean类型,然后再进行判断