天天看点

类型转换

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)      
上一篇: 类型转换
下一篇: 类型转换

继续阅读