Saya perlu melakukan beberapa percobaan dan saya perlu mengetahui beberapa jenis pengenal unik untuk objek di javascript, jadi saya bisa melihat apakah mereka sama. Saya tidak ingin menggunakan operator kesetaraan, saya membutuhkan sesuatu seperti fungsi id () di python.
Apakah ada yang seperti ini?
javascript
Stefano Borini
sumber
sumber
Jawaban:
Perbarui Jawaban asli saya di bawah ini ditulis 6 tahun yang lalu dengan gaya yang sesuai dengan zaman dan pemahaman saya. Menanggapi beberapa percakapan di komentar, pendekatan yang lebih modern untuk ini adalah sebagai berikut:
Jika Anda memiliki persyaratan browser kuno, periksa di sini untuk kompatibilitas browser untuk
Object.defineProperty
.Jawaban asli disimpan di bawah (bukan hanya di riwayat perubahan) karena menurut saya perbandingan itu berharga.
Anda dapat melakukan putaran berikut. Ini juga memberi Anda opsi untuk menyetel ID objek secara eksplisit di konstruktornya atau di tempat lain.
Berhati-hatilah untuk memastikan bahwa anggota apa pun yang Anda gunakan untuk menyimpan ID unik secara internal tidak bertabrakan dengan nama anggota yang dibuat secara otomatis.
sumber
object.hasOwnProperty(member)
saat menggunakanfor..in
loop. Ini adalah praktik yang terdokumentasi dengan baik dan yang diterapkan oleh jslintdefineProperty(…, {enumerable:false})
. Danuid
metodenya sendiri harus tetap berada diObject
namespace4
bagaimana Anda kemudian menetapkan obj dengan id 4 ke variabel sehingga Anda dapat melakukan sesuatu dengannya ... seperti mengakses propertinya?Sejauh pengamatan saya, jawaban apa pun yang diposting di sini dapat memiliki efek samping yang tidak terduga.
Di lingkungan yang kompatibel dengan ES2015, Anda dapat menghindari efek samping apa pun dengan menggunakan WeakMap .
sumber
return currentId
?WeakMap
sebagai lawanMap
? Fungsi itu akan macet jika Anda memberinya string atau angka.Browser terbaru menyediakan metode yang lebih bersih untuk memperluas Object.prototype. Kode ini akan membuat properti disembunyikan dari enumerasi properti (untuk p in o)
Untuk browser yang mengimplementasikan defineProperty , Anda bisa mengimplementasikan properti uniqueId seperti ini:
Untuk detailnya, lihat https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty
sumber
Sebenarnya, Anda tidak perlu memodifikasi
object
prototipe dan menambahkan fungsi di sana. Berikut ini harus bekerja dengan baik untuk tujuan Anda.sumber
object
peretasan. Anda hanya perlu menjalankannya ketika Anda ingin objek OP cocok dan tetap berada di luar jalan sepanjang waktu.Untuk browser yang menerapkan
Object.defineProperty()
metode ini, kode di bawah ini menghasilkan dan mengembalikan fungsi yang dapat Anda ikat ke objek apa pun yang Anda miliki.Keuntungan dari pendekatan ini adalah tidak memperluas
Object.prototype
.Kode bekerja dengan memeriksa apakah objek yang diberikan memiliki
__objectID__
properti, dan dengan mendefinisikannya sebagai properti read-only tersembunyi (non-enumerable) jika tidak.Jadi aman terhadap segala upaya untuk mengubah atau mendefinisikan ulang
obj.__objectID__
properti hanya-baca setelah itu telah ditentukan, dan secara konsisten melontarkan kesalahan bagus alih-alih gagal diam-diam.Akhirnya, dalam kasus yang sangat ekstrim di mana beberapa kode lain sudah didefinisikan
__objectID__
pada objek tertentu, nilai ini akan dikembalikan.sumber
Kode jQuery menggunakan
data()
metode itu sendiri seperti id tersebut.Pada metode backstage
data
membuat field yang sangat khusus yangobject
disebut"jQuery" + now()
put there next id dari aliran id unik sepertiSaya sarankan Anda menggunakan metode yang sama karena John Resig jelas tahu semua yang ada tentang JavaScript dan metodenya didasarkan pada semua pengetahuan itu.
sumber
data
Metode jQuery memiliki kekurangan. Lihat misalnya stackoverflow.com/questions/1915341/… . Juga, John Resig sama sekali tidak tahu semua yang perlu diketahui tentang JavaScript, dan percaya bahwa dia tidak akan membantu Anda sebagai pengembang JavaScript.Versi naskah ketikan jawaban @justin, kompatibel dengan ES6, menggunakan Simbol untuk mencegah benturan kunci dan ditambahkan ke Object.id global untuk kenyamanan. Cukup salin dan tempel kode di bawah ini, atau masukkan ke file ObjecId.ts yang akan Anda impor.
Contoh penggunaan:
sumber
Saya telah menggunakan kode seperti ini, yang akan menyebabkan Objek merangkai dengan string unik:
yang
__proto__
bit untuk menjaga__id__
getter dari muncul dalam objek. ini hanya diuji di firefox.sumber
__defineGetter__
ini tidak standar.Terlepas dari saran untuk tidak mengubah Object.prototype, ini masih bisa sangat berguna untuk pengujian, dalam cakupan terbatas. Penulis jawaban yang diterima mengubahnya, tetapi masih pengaturan
Object.id
, yang tidak masuk akal bagi saya. Berikut cuplikan yang berfungsi:sumber
Saya menghadapi masalah yang sama dan inilah solusi yang saya terapkan dengan ES6
sumber
Untuk tujuan membandingkan dua objek, cara termudah untuk melakukannya adalah dengan menambahkan properti unik ke salah satu objek pada saat Anda perlu membandingkan objek, periksa apakah properti tersebut ada di objek lain, lalu hapus lagi. Ini menghemat prototipe utama.
sumber