Wie können Sie überprüfen, ob zwei oder mehr Objekte / Variablen dieselbe Referenz haben?
javascript
equality
Clarkk
quelle
quelle
==
,===
undObject.is
werden alle true zurück , nach einem tiefen String - Vergleich durchführen. Im strengsten Sinne möchte das Originalplakat, dass der Vergleich falsch ist. Ich bin auf eine arkane Situation gestoßen, in der ich auch wollte, dass dieser Vergleich falsch ist, und konnte keine gute Lösung finden. Was ich wirklich brauche, sind die JS-Entsprechungen von Object.referenceEquals aus .NETDie Gleichheitsoperatoren und die strengen Gleichheitsoperatoren geben an, ob zwei Variablen auf dasselbe Objekt verweisen.
quelle
Bei referenztypähnlichen Objekten überprüfen die Operatoren == oder === nur die Referenz.
z.B
let a= { text:'my text', val:'my val'} let b= { text:'my text', val:'my val'}
hier ist a == b falsch, da die Referenz beider Variablen unterschiedlich ist, obwohl ihr Inhalt gleich ist.
aber wenn ich es ändere
und wenn ich jetzt a == b überprüfe, dann ist es wahr, da die Referenz beider Variablen jetzt gleich ist.
quelle
Ab sofort
ES2015
wurde eine neue MethodeObject.is()
eingeführt, mit der die Gleichheit zweier Variablen / Referenzen verglichen und bewertet werden kann:Nachfolgend einige Beispiele:
Object.is('abc', 'abc'); // true Object.is(window, window); // true Object.is({}, {}); // false const foo = { p: 1 }; const bar = { p: 1 }; const baz = foo; Object.is(foo, bar); // false Object.is(foo, baz); // true
Demo:
Code-Snippet anzeigen
console.log(Object.is('abc', 'abc')); console.log(Object.is(window, window)); console.log(Object.is({}, {})); const foo = { p: 1 }; const bar = { p: 1 }; const baz = foo; console.log(Object.is(foo, bar)); console.log(Object.is(foo, baz));
Hinweis: Dieser Algorithmus unterscheidet sich vom Strict Equality Comparison-Algorithmus durch die Behandlung von vorzeichenbehafteten Nullen und NaNs.
quelle
Möglicher Algorithmus:
Object.prototype.equals = function(x) { var p; for(p in this) { if(typeof(x[p])=='undefined') {return false;} } for(p in this) { if (this[p]) { switch(typeof(this[p])) { case 'object': if (!this[p].equals(x[p])) { return false; } break; case 'function': if (typeof(x[p])=='undefined' || (p != 'equals' && this[p].toString() != x[p].toString())) return false; break; default: if (this[p] != x[p]) { return false; } } } else { if (x[p]) return false; } } for(p in x) { if(typeof(this[p])=='undefined') {return false;} } return true; }
quelle