JavaScript中的数据类型转换

96 阅读2分钟

一、对象转换为数字或字符串

对象进行类型转换时,会先查找对象是否有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进行转换),转换规则:

image.png 注意:使用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'