实现思路
第一类:对象 == 字符串 对象.toString()变为字符串
第二类:数据劫持
方法一toString
var a = {
i: true,
toString: function() {
return this.i++
}
}
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法二 valueOf
var a = {
i: false,
valueOf: function() {
return ++this.i;
}
}
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法三
let a = [1,2,3];
a.join = a.shift;
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法四 toPrimitive
var a = {
i: 0,
[Symbol.toPrimitive]() {
return ++this.i;
}
}
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法五 defineProperty
var i = 1;
Object.defineProperty(window, 'a', {
get() {
return i++;
}
})
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法六 proxy
let a = new Proxy({}, {
i: 1,
get: function () {
return () => this.i++;
}
});
if(a == 1 && a == 2 && a==3) {
console.log("条件成立")
}
方法七 with
with({
get a() {
return Math.floor(Math.random()*3 + 1);
}
}){
for(var i = 1;i <= 100;i++){
if (a == 1 && a == 2 && a == 3){
console.log("条件成立")
break;
}
}
}
还有其他的衍生方法,硬写的话论条件成立的100种方法都有可能。。。以上的实现基本是分成两大类,一种是转化成字符串,另外一种数据劫持。大家还有其他的思路实现请告诉我。
Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。
Symbol.toPrimitive MDN介绍:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive
网友评论