一、对象转换为数字或字符串
对象进行类型转换时,会先查找对象是否有Symbol.toPrimitive方法.如果有,则返回Symbol.toPrimitive方法的返回值.如果没有则调用valueOf(),获取对象的原始值.调用valueOf()取到的不是原始类型值,继续调用toString(),将对象转换为字符串.如果需要转换为数字,则继续调用Number().
关于==和===,==进行比较的时候,如果两边类型不一致,则转换为相同的数据类型;===不会进行类型转换,类型不一致,直接返回false。
console.log(NaN == NaN)=>false
console.log(Object.is(NaN,NaN))=>true
console.log(null == undefined)=>true
console.log(null === undefined)=>false
//null&undefined和其他任何类型值比较都是不相等的
//对象==字符串,对象转换为字符串,剩余情况都是转换为数字
//定义a 使得a == 1 && a == 2 && a == 3
var a
if(a == 1 && a == 2 && a == 3) {
console.log('ok)
}
方案一: 利用 == 进行比较时的隐式类型转换,重写Symbol.toPrimitive方法
var a = {
i: 1,
[Symbol.toPrimitive]() {
return this.i ++
}
}
if (a == 1 && a == 2 && a == 3) {
console.log('ok');
}
方案二:使用数据劫持,获取值时调用getter方法
var i = 1
Object.defineProperty(window,'a',{
get(){
return i++
}
})
if (a == 1 && a == 2 && a == 3) {
console.log('ok');
}
二、其他数据类型转换为number
隐式转换:
==、数学运算符(+特殊)
显式转换:
Number(隐式转换也是使用Number进行转换),转换规则:
注意:使用Number将字符串转换为数字时,出现非有效字符时,返回NaN。
parseInt([val],[radix])、parseFloat([val],[radix])处理机制:
[val]必须是一个字符串,如果不是,则默认转换字符串
[radix]范围:2~36,不在范围内,返回NaN
[radix]不设置或设置0,都按10处理;如果字符串以'0x'开头,默认值为16。 在[val]中查找所有符合[radix]进制的内容,直到遇到不符合的为止。把找到的字符串看作[radix]进制,转化为十进制。
//进制转换面试题
let arr = [27.2,0,'0013','14px',123]
arr = arr.map(parseInt)
console.log(arr) => [27,NaN,1,1,27]
三、其他数据类型转换为布尔值
只有'0/NaN/null/undefined/空字符串'转换为false,其余都是true
let result = 100 + true + 21.2 + null + undefined + 'hello' + [] + null + 9 + false
console.log(result) => 'NaNhellonull9false'