变量的数据类型转换
# 前言
概念:将一种数据类型转换为另一种数据类型
通常有三种形式的类型转换:
- 转换为字符串类型
- 转换为数值类型
- 转换为布尔型
转换为 null 和 undefined 没有意义。
# typeof 运算符
获取变量的数据类型
typeof a
typeof(a)
2
typeof运算符返回结果的类型式string
# 变量类型转换的分类
# 显式类型转换
- toString()
- String()
- Number()
- parseInt(String)
- parseFloat(String)
- Boolean()
# 隐式类型转换
- isNaN()
- 自增/自减运算符
++-- - 正号/负号
+a-a - 加号
+ - 运算符
-*/
# 特殊隐式类型转换
逻辑运算符:
&&||!非布尔值进行与或运算时,会先将其转换为布尔值,然后运算,但是运算结果时原值。关系运算符:
<><=>=等。关系运算符得到的运算结果都是布尔值
# 其他简单类型 -> String
# 字符串拼接 隐式类型转换
let a = 1
console.log(a+'')
2
内部调用String()函数,a = a+'' 等价于 a = String(a)
# toString()
a.toString()
toString不会影响到原有变量,它会将转换结果返回
补充
null 和 undefined 这两个值没有 toString()方法
Number类型调用toString时,可以再方法中传递一个整数作为参数。toString会把数字转换为指定进制,不指定默认转换为10进制
# String() 强制转换
String(a)
- 对于 Number 和 Boolean 而言,本质就是调用toString()方法。
- 对于 null 和 undefined,则不会调用toString()方法。null 直接转换为 "null" , undefined 直接转换为 "undefined"
# 其他数据类型 -> Number
# Number()
使用Number函数分为三种情况:
- 字符串 -> 数字
- 如果字符串中是纯数字,直接转换为数字
- 如果字符串中包含了非数字(小数点不包括),则在转换为NaN
- 如果字符串是一个空字符串或者全是空格,则转换为0
- 布尔 -> 数字
- true -> 1
- false -> 0
- null -> 数字
- 0
- undefined -> 数字
- NaN
使用Number函数,如果无法转换为数字,则会转换为NaN
- NaN
# parseInt()
parseInt的作用是将字符串中的有效数字转换为数字
parseInt("5")
2
- 如果字符串为数字字符串结合,
只保留字符串最开头的数字,中文后面部分全部消失如果对非String使用,会先转为String再进行操作- 四舍五入
- 如果字符串不是数字开头,则直接转换为NaN
- 如果字符串是一个空串或者空格,转换时会报错
- 如果有两个参数,后面参数表示将需要转换的变量作为x进制转换为十进制
boolean,null,undefined 使用parseInt函数都会得到NaN
# parseFloat()
将字符串转换为浮点数
内容可参考
parseInt(),不同的是 parseFloat 可以获得有效的小数部分。
补充
- 16 进制的数字,以
0x开头 - 8 进制的数字,以
0开头 - 2 进制的数字,
0b开头(不是所有的浏览器都支持:chrome 和火狐支持,IE 不支持)
# 转换为Boolean
其他的数据类型都可以转换为 Boolean类型。情况如下:
- 数字 -> 布尔
除了0,NaN,其他都是true
- 字符串 -> 布尔
除了空串,返回都是true。空格字符串也返回true
- null/undefined 都会转换为 false
- 引用数据类型会转换为 true,
[]{}也会转换为true
# 隐式转换为Boolean类型
当非 Boolean 类型的数值和 Boolean类型的数值做比较时,会先把前者进行隐式转换为 Boolean类型,然后再做比较。举例如下:
console.log(1 == true); // 打印结果:true
console.log(0 == true); // 打印结果:false
2
# 显式转换为Boolean类型
- 使用
!!可以显式转换Boolean类型。 - 使用Boolean()函数
# 隐式转换
隐式类型转换,内部调用的都是显式类型的方法
# isNaN()
判断指定参数是否为NaN,返回结果为Boolean类型。
执行过程
- 先调用Number()函数
- 然后将Number()返回结果与NaN进行比较
# 自增/自减运算符
执行过程
先调用Number(参数)函数;
然后将Number(参数)的返回结果进行 加 1 操作。
# 正号/负号
执行过程
注意,这里说的是正号/负号,不是加号/减号。
任何值做+a -a 运算时,运算结果都会自动转换为 Number 类型。 内部调用的是 Number() 函数。
# 加号
- 字符串 + 数字
- 当加号的两边,只要有一个是字符串的时候,就会调用 String() 函数将数字转为字符串,然后再计算。导致最终的运算结果是字符串
- Boolean + 数字
- Boolean 型和数字型相加时, true 按 1 来算 ,false 按 0 来算。这里其实是先调 Number() 函数,将 Boolean 类型转换为 Number类型,然后再和 数字相加
- null + 数字
- 等价于:0 + 数字
- undefined + 数字
- 计算结果:NaN
# 运算符:-、*、/
任何非 Number 类型的值做-、*、/运算时,会将这些值转换为Number然后再运算(内部调用的是 Number() 函数),运算结果是 Number 类型。(注:任何值 + 字符串是特例,运算结果是字符串)
任何的值和字符串做加法运算,都会先转换为字符串,然后再做拼串操作
任何值和NaN做运算的结果都是NaN