1. Object.defineProperty
var val = 1;
Object.defineProperty(window, 'a', { configurable: true, get: function() { console.log(`触发第${val}次get`); return val++ } }) if(a == 1 && a == 2 && a == 3) { console.log('yes!') } 触发第1次get 触发第2次get 触发第3次get yes!
2.のtoString()のvalueOf()
const b = {
i: 1,
toString: function () { return this.i++; } } if(b == 1 && b == 2 && b == 3) { console.log('Hello World!'); // Hello World! } const b = { i: 1, valueOf: function () { return this.i++; } } if(b == 1 && b == 2 && b == 3) { console.log('Hello World!'); // Hello World! }
暗黙的に比較元の値とオブジェクトの比較の種類は、オブジェクトが元の型の値を変換し、その後比較される場合、のtoString又はvalueOfメソッドを呼び出します。元の型に変換されたオブジェクトの値は、アルゴリズムは、オブジェクトが返された場合、その後、最初の呼valueOfメソッドであり、再度のtoStringメソッドを呼び出し
3. array.join = array.shift
var a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3);
a == 1 ,此时 a 返回的就是shift返回的第一个元素 1 ,比较完之后 a = [2,3]
a == 2 ,此时 a 返回的就是shift返回的第一个元素 2 ,比较完之后 a = [3]
a == 3 ,此时 a 返回的就是shift返回的第一个元素 3 ,比较完之后 a = []
配列はオブジェクトである、配列toStringメソッド()はアレイ内のtoStringの各要素を、文字列を返す(カンマで区切られた)()メソッドコネクタ部品を接合呼び出すことによって値を返します。
4.Proxy
VaRの A = 新たなプロキシ({I:0 }、{ 得る:(ターゲット名) =>名=== Symbol.toPrimitive()=> ++?target.i:ターゲット[名] })。 console.log( == 1 && == 2 && == 3)。
5. Symbol.toPrimitive
// のtoStringのES6等価であるSymbol.toPrimitiveを使用して別の溶液、/のvalueOfは =せ{[Symbol.toPrimitive]:(式(I)=>()=> ++ i)から(0 )}。 console.log( == 1 && == 2 && == 3)。
6.特別な割り当て
するvar = ㅤ A 1。; VARの A = 2 ; varが =をㅤ 3。; IF( ㅤ 1 && A == == == 2 && A ㅤ 3。。){ にconsole.log( "なぜそここんにちは!" ) } / / = ㅤ LETのA 1; // のlet A = 2; // = ㅤ LETのA 3; // https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3- -to-評価・エヴァー#への真 // ここでは三つの異なる変数は、第1および第3の空白文字がない空白の前後にある、ユニコードFFA0は // なお、奇妙な間隔のif文。これは、=、=、半値幅韓国人です。これは、Unicodeのスペース文字ですが、ECMAScriptのは、単一のスペースとして解釈されない-それは有効な識別子であることを意味します。こうして3つの全く異なる変数、半値幅は、半値幅が韓国語が先行され、韓国の後に添加されるがあります。
7.デジタル変数名
var a = 1 ; var ㅤ 1 = a; var ㅤ 2 = a; var ㅤ 3 = a; console.log(a == ㅤ 1 && a == ㅤ 2 && a == ㅤ 3);
あなたが達成するために他の方法を持っている場合は、実装のヨーヨーにご意見を残すことができます!