类型转换
1.原始值转
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
falsey(虚值): false 0 '' undefined null 除了虚值都是真值
![] // false
!{} // false
2.对象转原始值
2.1 typeof 的值 string number boolean undefined symbol object function
console.log(typeof 'string') // string console.log(typeof 123) // number console.log(typeof true) // boolean console.log(typeof Symbol('a')) // symbol console.log(typeof null) // object console.log(typeof undefined) // undefined console.log(typeof {}) // object console.log(typeof function (){}) // function console.log(typeof []) // object console.log(typeof Date) // function console.log(typeof Date()) // string console.log(typeof new Date()) // Object
2.2 Number()
valueOf() -> 如果是原始值 -> Number转数字
valueOf() -> 如果是引用值 -> 找toString
valueOf() -> 找toString
toString() -> 如果是原始值 -> Number转数字
toString() -> 如果是引用值 -> 报错
无toString() -> Object.prototype.toString.call(a) -> Number转数字
2.3 扩展-parseInt()
弥补Number的不足
console.log(parseInt('123aaa')) // 123 console.log(parseInt('1.23aaa')) // 1 console.log(parseInt(11)) // 11 console.log(parseInt(11,3)) // 4
2.4 toString()
等同于string(a)
toString() -> 如果是原始值 -> 调用其原型的toString()
toString() -> 如果是引用值 -> 调用valueOf()
valueOf() -> 如果是原始值 -> 调用其原型的toString()
valueOf() -> 如果是引用值 -> 报错
2.5 隐式转换
特例:
(1)null == undefined null和undefined相等,除此之外和谁都不等
!null == true 但 null != false
!undefined == true 但 undefined != false
(2)NaN != NaN
(3)Number() 转换:==、任何运算符
(4)Boolean转换:if()等 && ! ||
console.log([] == ![]) // true Number转换 String([]) -> 0 ![] -> false console.log({} == {}) // false 比对的是地址值 console.log({} == !{}) // false {} -> NaN !{} -> false
(5)实现 a==1 && a==2 && a==3
// 方案1:利用隐式数据转换
const a = { num:1, valueOf(){ return this.num ++ } }
console.log(a==1 && a==2 && a==3)
// 方案2:利用proxy数据劫持
let a = new Proxy({},{
i:1,
get(){
return ()=>this.i++
}
})
console.log(a==1 && a==2 && a==3)
// 方案3:toString默认调用的是join(),重写join
let a = [1,2,3]
a.join = a.shift
console.log(a==1 && a==2 && a==3)