对象转原始类型是根据什么流程运行的
对象转原始类型,会调用内置的[ToPrimitive]函数,对于该函数而言,其逻辑如下:
如果Symbol.toPrimitive()方法,优先调用再返回
调用valueOf(),如果转换为原始类型,则返回
调用toString(),如果转换为原始类型,则返回
如果都没有返回原始类型,会报错
var obj = {
value: 3,
valueOf() {
return 4;
},
toString() {
return '5'
},
[Symbol.toPrimitive]() {
return 6
}
}
console.log(obj + 1); // 输出7
实现宽松等于下的 (a==1&&a==2&&a==3) 为真
方法一
var a = {
value: 0,
valueOf: function() {
this.value++;
return this.value;
}
};
console.log(a == 1 && a == 2&&a ==3);//true
方法二
const a={
i:1,
toString(){
return a.i++
}
}
console.log(a==1&&a==2&&a==3)
方法三
let a=new Proxy({i:1},{
get(target){
return ()=>target.i++
}
})
console.log(a==1&&a==2&&a==3)
实现严格相等下的 (a===1&&a===2&&a===3) 为真
补充说明能实现严格相等就可以实现宽松相等
方法一
let i=1
Object.defineProperty(window,'a',{
get(){return i++}
})
console.log(a===1&&a===2&&a===3)
方法二
const value=function*(){
let i=1
while(true)yield i++
}()
Object.defineProperty(window,'a',{
get(){
return value.next().value
}
})
console.log(a===1&&a===2&&a===3)
JavaScript 对象转换为原始类型的逻辑解析
本文详细介绍了JavaScript中将对象转换为原始类型的过程,包括调用内置的[ToPrimitive]函数,valueOf()和toString()方法的优先级。通过示例展示了如何利用这些机制实现特定的逻辑,如在宽松和严格相等条件下使表达式为真的技巧。
683

被折叠的 条评论
为什么被折叠?



