js数据类型隐式转换

59 阅读2分钟
 //转字符串
 console.log(typeof true)  // boolean
 console.log(typeof true.toString()) //String
 console.log(typeof undefined)  // undefined
 console.log(typeof toString(undefined)) // string
 console.log(typeof toString(" ")) //string
 // 转数字
console.log(typeof Number('111')) //number
 console.log(typeof "") // string
 console.log(typeof Number("")) //number
 //字符串转整数
 console.log(parseInt(23.45)) //23
 console.log(parseInt("23.45")) //23
 console.log(parseInt("")) //NaN
 console.log(parseInt(" ")) //NaN
 //字符串转浮点
 console.log(parseFloat("23.45")) // 23.45
 console.log(parseFloat("123.45abc")) // 123.45
 console.log(parseFloat("123.aa")) // 123
 // 转布尔类型
 console.log(Boolean(NaN)) //false
 console.log(Boolean(0)) // false
 console.log(Boolean(1)) // true
 console.log(Boolean("")) // false
 console.log(Boolean("  ")) // true
 console.log(Boolean(null))  // false
 console.log(Boolean(undefined)) //false
 console.log(Boolean(45)) // true
 console.log(Boolean(Infinity))  //true

 //数据类型隐式转换

 //转字符串
 // 只要有一边是字符串则将非字符串的一边转成字符串
 let a='Tower'+1
 console.log(typeof a)  //String
 let b=true+'abc'
 console.log(typeof b)  // string
 // 转Number
 let d='100'
 let e=d--
 console.log(e) // 100 number
 console.log(d) // 99

 //符号两边有一边是Number型,此时+为算数运算符,则将令一边的数据转成Number型。此处注意空字符串、null以及布尔的false Number之后都是0

 console.log(1+true)  // 2
 console.log(1+undefined)  // NaN ?  // 先Number(undefined) => NaN ,再计算,结果NaN
 console.log(1+null)  // 1 ? 先Number(null) => 0,再计算,结果为1


 // 复杂数据类型隐式转换
// 复杂数据类型隐式转换时会先调用自身的valueOf()和toString()两个函数,
 // 如果自身数据原型对象上没有相应的函数则会由原型链__proto__最终调用到Object.prototype对象对应的函数上,所有对象(除Null 和 undefined)都会继承这两个方法。


 console.log([1,2] == '1,2') // true 解析如下
     //  valueOf() 方法返回指定对象的原始值。
 console.log([1,2].valueOf()) // [1,2],获取原始值
 console.log([1,2].toString()) // '1,2',转成字符串,与右边数据相等

 var o = {}
 console.log(o == "[object Object]") // true

 // 左边转换过程
 console.log(o.valueOf()) // {}
 console.log({}.toString()) // "[object Object]",再进行比较


 console.log(![] == 0) // true 解析:空数组转换布尔型是true,取非后为false;false跟数字0比较, 布尔型被Number后为0,0 == 0


 console.log([] == ![]) // true [].valueOf().toString()=>''; ![] => false 关系运算符将两边转成Number型进行比较,Number('') => 0; Number(false) => 0
 console.log([].valueOf().toString()) // ''
 console.log(Number(' ')) // 0

 console.log({} == !{}) // false 逻辑非优先级高,其实是{}和!{},这个逻辑表达式的比较,按照复杂类型隐式转换规则,需通过valueOf和toString转换后进行比较
                        // !Number({}.valueOf().toString() true
 console.log(Number({}.valueOf().toString())) //NaN
 console.log(!{}) //false
 console.log({})
 console.log(Boolean(NaN)) //false

 //引用类型
 console.log([] == []) // false 数组为引用类型,在堆中存放的是两份不同的数据,所以比较结果不相等
 console.log({} == {}) // false,同理,{}为引用类型,结果不相等