数据类型的转换
- JS是一种动态类型语言,
变量的类型必须等到运行时才会确定。但是各种运算符对数据类型是有要求的,如果发现与预期不符则会自动进行类型转换,除此之外还有手动类型转换。
'5' - '4' // 1 自动转为了数值
强制转换
Number()
- 原始值
Number('324') // 324
Number('324a') // NaN
Number('') // 0
Number(true) // 1
Number(undefined) // NaN
Number(null) // 0
- 对象
Number({a:1}) // NaN
Number([1,2,3]) // NaN
Number([1]) // 1
Number([]) // 0
调用
valueOf(),如果返回原始值则直接调用Number()。如果返回的还是对象,则调用toString(),然后再调用Number()。
String()
- 原始值
String(0) // '0'
String(true) // 'true'
String(undefined) // 'undefined'
String(null) // 'null'
String(123) // '123'
- 对象
String({a :1}) // '[object Object]'
String([1,2,3]) // '1,2,3'
String([]) // ''
调用
toString(),如果返回原始值则直接调用String()。如果返回的是对象,则调用valueOf(),然后再调用String()。
Boolean()
- 原始值
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
- 对象
Boolean({}) // true
Boolean([]) // true
所有对象转为
boolean都是true。
自动转换
- 自动转换是以
强制转换为基础,相当于隐式调用Number()、Boolean()、String()。
自动转为布尔
if('abc'){ // if中的表达式会自动转为boolean
alert(1);
}
1 ? true : false; // 三元表达式中的第一个表达式
!true // 取反
相当于隐式调用Boolean()。
自动转为字符串
'5' + 1 // '51'
'5' + true // 'true5'
'5' + {} // '5[object Object]'
'5' + [] // '5'
'5' + function(){} // '5function(){}'
相当于隐式调用String()。
自动转为数值
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
'1' - 1 // 0
5 * [] // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN
+'abc' // NaN
-true // -1
'5' > 2 // true
true < 2 // true
相当于隐式调用Number()。
[] == ![] 详解
console.log([] == ![]); // true
// !优先级高,先将[]转为boolean,所有对象转为boolean都为true,取反为 false。
// 变成了 [] == false
// 对象和原始值相等比较:
// 调用valueOf():[].valueOf() => [],返回的不是对象。
// 再调用toString() :[].toString() => '',返回的是空串。
// 变成了 '' == false
// Number('') === Number(false) // true