小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
介绍
我们都知道JS中有六种简单数据类型:undefined、null、string、number、boolean、symbol、object(引用类型)。
我们在声明的时候只有一种数据类型,在运行的时候才会确定变量的当前类型,如果运算时候的类型和预期不符合,就会触发类型转换机制。
常见的类型转换有:显式转换、隐式转换。
显示转换
显式转换就是我们俗称的强制转换,常见的方法有:
-
Number()
-
parselnt()
-
String()
-
Boolean()
Number()
是强制把任意类型的值转换为数值,规则如下:
-
undefined —— NaN
-
Null —— 0
-
true —— 1
-
false —— 0
-
Symbol —— Throw a TypeError exception
-
Object —— NaN
-
String —— NaN
特殊情况:
// 在空字符串的时候是转为0的
Number(''); //0
Number('dswe3'); //NaN
// 对象:通常转换成 NaN(除了只包含单个数值的数组)
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
parselnt()
相对于Number转换时只要遇到一个字符无法转换为数值,整个字符串就会被转换为NaN,parselnt函数会逐个解析,遇到不能转换的字符就停止解析,例如:
parselnt('67djj88'); // 67
String()
可以将任意类型的值转化成字符串,规则如下:
Undefined —— 'Undefined'
Boolean —— 'true' 或者'false'
Number —— 对应数字的字符串
String —— String
Symbol —— Throw a TypeError exception
Object —— '[object Object]'
特殊情况:
String({r: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
Boolean()
可以将任意类型的值转为布尔值,规则如下:
- 可以转换为true的:
true、非空字符串、非零数值、任意对象、N/A
- 可以转换为false的:
false、空字符串、0、NaN、null、undefined
示例:
Boolean(undefined); // false
Boolean(null); // false
Boolean(0); // false
Boolean(NaN); // false
Boolean(''); // false
Boolean({}); // true
Boolean([]); // true
Boolean(new Boolean(false)); // true
隐式转换
基本上隐式转换时在两种情况下发生的:
- 比较运算(==、!=、>、<)、if、while 需要布尔值地方
- 算术运算(+、-、*、/、%)
自动转换为布尔值
除了下面几种会被转化成 false,其他都换被转化成 true
- undefined
- null
- false
- +0
- -0
- NaN
- ""
自动转换成字符串
遇到预期为字符串的地方,就会将非字符串的值自动转为字符串。
先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串:
'1' + 1 // '11'
'1' + true // "1true"
'1' + false // "1false"
'1' + {} // "1[object Object]"
'1' + [] // "1"
'1' + function (){} // "1function (){}"
'1' + undefined // "1undefined"
'1' + null // "1null"
自动转换成数值
除了+有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN