一、数据类型
JS一共有六种简单的数据类型:undefined、null、boolean、string、number、symbol,以及三种引用类型:function、object、array.
但是JS在声明的时候只用一种类型,只有到运行的时候才能确定当前的类型。在运行期间,由于JS没有对类型做严格限制,导致不同类型
之间可以进行运算,这样就需要允许类型之间相互转换
二、类型转换
1、显式类型转换
显示类型转换就是手动将一种值转换为另一种值。
转换为Number类型 | Number() / parseFloat() / parseInt() |
---|---|
转换为String类型 | String()/ toString() |
转换为Boolean类型 | Boolean() |
常见的显示类型转换方法有Number、String、Boolean、parseInt、parseFloat、toString
(1)parseInt():转化为整数并取整直接舍去小数
a、概念
parseInt(string,radix)解析一个字符串并返回指定基数的十进制整数,radix是2-36之间的整数,表示被解析的字符串的基数
string :
要被解析的值。如果参数不是一个字符串,则将其转换为字符串。字符串开头的空白符将会被忽略
radix(可选):
从2到36,表示字符串的基数。类如,指定16表示被解析值是十六进制数。请注意,10不是默认值
返回值:
从给定的字符串中解析出一个**整数**,但是当radix小于2或者大于36,或者第一个非空格字符不能转换为数字,返回NaN
b、例子:
console.log([1,2,3].map(parseInt));//[1,NaN,NaN]
(2)parseFloat():转化为一个浮点数
a、概念
parseFloat(string):函数解析一个参数(必要时先转换为字符串)并返回一个浮点数
string:
需要解析为浮点数的值
返回值:
给定值被解析为浮点数。如果给定值不能被转换为数值,则会返回NaN
(3)Number():将其它类型转换到number类型
原始值 | 转换结果 |
---|---|
undefined | NaN |
null | 0 |
true | 1 |
false | 0 |
String | 根据语法和转换规则来转换 |
Symbol | Throw a TypeError exception |
Object | 先调用toPrimitive,再调用toNumber |
String 转换为 Number 类型的规则:
1、如果字符串中只包含数字,那么就转换为对应的数字
2、如果字符串中只包含十六进制格式,那么就转换为对应的十进制数字
3、如果字符串为空,那么转换为0
4、如果字符串包含上述之外的字符,那么转换为NaN
使用 + 可以将其它类型转换为number类型:
+undefined // NaN
+null // 0
+true // 1
+false // 0
+'111' // 111
+'0x100F' // 4111
+'' // 0
'b' + 'a' + + 'a' + 'a' // 'baNaNa'
+Symbol() // Uncaught TypeError: Cannot convert a Symbol value to a number
(4)Boolean():将其它类型转换为boolean类型
原始值 | 转换结果 |
---|---|
undefined | false |
boolean | true or false |
Number | 0和NaN返回false,其他返回true |
Symbol | true |
Object | true |
(5)String():将其它类型转换为字符串
原始值 | 转换结果 |
---|---|
undefined | ‘undefined’ |
boolean | ‘true’ or ‘false’ |
Number | 对应的字符串类型 |
String | String |
Symbol | Throw a TypeError exception |
Object | 先调用toPrimitive,再调用toNumber |
转换到string类型可以用模板字符串来实现:
`${undefined}` // 'undefined'
`${true}` // 'true'
`${false}` // 'false'
`${11}` // '11'
`${Symbol()}` // Cannot convert a Symbol value to a string
`${{}}`
(6)toString():返回一个表示该对象的字符串
2、隐式类型转换
隐式类型转换都会调用显示类型
(1)数学运算符中的类型转换
a、减、乘、除:我们在对各种非Number类型运用数学运算符(- * /)时,会先将非Number类型转换为Number类型
1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1
1 - null // 1, 首先把 null 转换为数字 0, 然后执行 1 - 0
1 * undefined // NaN, undefined 转换为数字是 NaN
2 * ['5'] // 10, ['5']首先会变成 '5', 然后再变成数字 5
b、加法的特殊性
规则1:当一侧为String类型,被识别为字符串拼接,并会优先将另一侧转换为字符串类型
规则2:当一侧为Number类型,另一侧为原始类型,则将原始类型转换为Number类型
规则3:当一侧为Number类型,另一侧为引用类型,将引用类型和Number类型转换成字符串后拼接
123 + '123' // 123123 (规则1)
123 + null // 123 (规则2)
123 + true // 124 (规则2)
123 + {} // 123[object Object] (规则3)
(2)逻辑语句中的类型转换
当我们使用 if while for 语句时,我们期望表达式是一个Boolean,所以一定伴随着隐式类型转换。而这里面又分为两种情况:
a、单个变量
如果只有单个变量,会先将变量转换为Boolean值
只有null undefined '' NaN 0 false 这几个是 false,其他情况都为true,比如{},[]
b、使用==比较中的五条规则
规则1:
NaN和其他任何类型比较永远返回false(包括和他自己)
NaN == NaN //false
规则2:
Boolean 和其他任何类型比较,Boolean 首先被转换为 Number 类型
true == 1 // true
true == '2' // false, 先把 true 变成 1,而不是把 '2' 变成 true
true == ['1'] // true, 先把 true 变成 1, ['1']拆箱成 '1', 再参考规则3
true == ['2'] // false, 同上
undefined == false // false ,首先 false 变成 0,然后参考规则4
null == false // false,同上
规则 3:
String和Number比较,先将String转换为Number类型
123 == '123' // true, '123' 会先变成 123
'' == 0 // true, '' 会首先变成 0
规则 4:
null == undefined比较结果是true,除此之外,null、undefined和其他任何结果的比较值都为false
null == undefined // true
null == '' // false
null == 0 // false
null == false // false
undefined == '' // false
undefined == 0 // false
undefined == false // false
规则 5:
原始类型和引用类型做比较时,引用类型会依照ToPrimitive规则转换为原始类型
ToPrimitive规则,是引用类型向原始类型转变的规则,它遵循先valueOf后toString的模式期望得到一个原始类型
'[object Object]' == {}
// true, 对象和字符串比较,对象通过 toString 得到一个基本类型值
'1,2,3' == [1, 2, 3]
// true, 同上 [1, 2, 3]通过 toString 得到一个基本类型值
C、隐式类型转换练习题:
1. [] == ![]
- 第一步,= 右边先执行,![] 会变成 false
- 第二步,应用 规则2 ,题目变成: [] == 0
- 第三步,应用 规则5 ,[]的valueOf是0,题目变成: 0 == 0
- 所以, 答案是 true !
2. [undefined] == false
- 第一步,应用 规则5 ,[undefined]通过toString变成 '',
题目变成 '' == false
- 第二步,应用 规则2 ,题目变成 '' == 0
- 第三步,应用 规则3 ,题目变成 0 == 0
- 所以, 答案是 true !
// 但是 if([undefined]) 又是个true