天天看點

類型轉換

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)      
上一篇: 類型轉換
下一篇: 類型轉換

繼續閱讀