實(shí)現(xiàn)思路
第一類(lèi):對(duì)象 == 字符串 對(duì)象.toString()變?yōu)樽址?/h4>
第二類(lèi):數(shù)據(jù)劫持
方法一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;
}
}
}
var a = {
i: true,
toString: function() {
return this.i++
}
}
if(a == 1 && a == 2 && a==3) {
console.log("條件成立")
}
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("條件成立")
}
var a = {
i: 0,
[Symbol.toPrimitive]() {
return ++this.i;
}
}
if(a == 1 && a == 2 && a==3) {
console.log("條件成立")
}
var i = 1;
Object.defineProperty(window, 'a', {
get() {
return i++;
}
})
if(a == 1 && a == 2 && a==3) {
console.log("條件成立")
}
let a = new Proxy({}, {
i: 1,
get: function () {
return () => this.i++;
}
});
if(a == 1 && a == 2 && a==3) {
console.log("條件成立")
}
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;
}
}
}
還有其他的衍生方法韭畸,硬寫(xiě)的話(huà)論條件成立的100種方法都有可能崎坊。西傀。虏束。以上的實(shí)現(xiàn)基本是分成兩大類(lèi),一種是轉(zhuǎn)化成字符串表箭,另外一種數(shù)據(jù)劫持筐乳。大家還有其他的思路實(shí)現(xiàn)請(qǐng)告訴我。
Symbol.toPrimitive 是一個(gè)內(nèi)置的 Symbol 值饺鹃,它是作為對(duì)象的函數(shù)值屬性存在的汗侵,當(dāng)一個(gè)對(duì)象轉(zhuǎn)換為對(duì)應(yīng)的原始值時(shí),會(huì)調(diào)用此函數(shù)极舔。
Symbol.toPrimitive MDN介紹:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive