类型转换

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)

 



posted @ 2021-08-20 14:35  卷叶小树  阅读(23)  评论(0编辑  收藏  举报