Objek JSON != objek JavaScript?
Untuk kenyamanan, saya menulis prototipe toJSON sederhana, untuk menangani JSON yang saya tahu aman:
String.prototype.toJSON = function () {
return JSON.parse(this.valueOf());
};
Saya menggunakannya untuk menguji layanan web saya. Sayangnya, bahkan dengan tes sederhana ini:
var v0 = '{"echo":"hello_world"}'.toJSON(), v1 = {"echo": "hello_world"};
Ini gagal:
console.log(v0 == v1); // false
console.log(v0 === v1); // false
console.log(v0.echo == v1.echo); // true
console.log(v0.echo === v1.echo); // true
Apa yang tidak saya ketahui tentang JavaScript yang menyebabkan masalah ini?
Jawaban #1
Hanya karena Anda memiliki konten yang sama, itu tidak berarti bahwa Anda memiliki instance objek yang sama. Jika Anda melakukan v1=v0 alih-alih menginisialisasi v1 secara terpisah, dua yang pertama akan mengembalikan true.
Pembaruan: Jika Anda perlu membandingkan dua instance untuk mengetahui apakah mereka memiliki konten yang sama, maka Anda perlu mendefinisikan sebuah fungsi yang membandingkan setiap anggota.
Jawaban #2
Sebuah objek dalam JavaScript, sama seperti segala sesuatu kecuali tipe primitif (int, string, Boolean), adalah sebuah referensi.
Memiliki 2 objek duplikat yang berbeda, berarti memiliki 2 referensi berbeda yang menunjuk ke tempat yang berbeda dalam hype.
Anda bisa menerapkan sesuatu yang sesederhana itu, pada dasarnya untuk mengulang semua properti primitif dari sebuah objek, dan membandingkannya satu per satu:
Object.prototype.equals = function(x)
{
for(p in this)
{
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; }
}
}
for(p in x)
{
if(typeof(this[p])=='undefined') {return false;}
}
return true;
}
