对象隐式转换问题
当一个引用类型要去和一个值类型去做比较时,引用类型会尝试将自己转换为值类型,其中涉及到两个方法:
- Object.valueOf( )
- Object.toString( )
首先会进行调用value.of
方法,如果返回值仍不为值类型,则会调用toString
方法
const arr = [1,2,3]
const fun = function() { console.log('this is a function') }
const obj = { value: 1 }
// 引用类型使用valueOf()返回的是本身
console.log(arr.valueOf()) // [1,2,3]
console.log(fun.valueOf()) // ƒ () { console.log('this is a function') }
console.log(obj.valueOf()) // { value: 1 }
// 引用类型执行valueOf()后结果
console.log(arr.toString()) // '1,2,3'
console.log(fun.toString()) // 'function() { console.log('this is a function') }'
console.log(obj.toString()) // '[object Object]'
// 验证为string类型
console.log(arr.toString() === '1,2,3') // true
console.log(fun.toString() === 'function() { console.log(\'this is a function\') }') // true
console.log(obj.toString() === '[object Object]' ) // true
由原型链的内容可知,自身没有的方法会从原型中继承而来,如果自身拥有则调用自身,上面对象的value.of
和toString
都是从Object
原型中拿来的
如一个问题:什么情况下a==1&&a==2&&a==3
可以利用隐式转换时自动调用value.of
和toString
方法的机制
为一个对象内部自身添加该方法,则隐式调用的时候就可以优先调用对象本身而非原型上的这两个方法,这样就能按照自己的逻辑改写隐式转换的逻辑了
let a = {
i: 1,
toString () { //或者valueOf
return a.i++ //根据逻辑,这里是先返return后加
}
}
if(a == 1 && a == 2 && a == 3) {
console.log('成功'); // 成功
}
console.log(a.i) // 4 每调用一次toString方法i自增,证明确实有在自动调用toString方法