Object.freeze()
Sepertinya metode kenyamanan transisi untuk bergerak menggunakan const
ES6.
Apakah ada kasus di mana keduanya mengambil tempat dalam kode atau apakah ada cara yang disukai untuk bekerja dengan data yang tidak dapat diubah?
Haruskah saya menggunakan Object.freeze()
sampai saat ini semua browser saya bekerja dengan dukungan const
kemudian beralih menggunakan const
?
javascript
ecmascript-6
Sergei Basharov
sumber
sumber
Object.isFrozen
tetapi mereka juga tipe data primitif mereka sendiri ...)Jawaban:
const
danObject.freeze
dua hal yang sangat berbeda.const
berlaku untuk binding ("variabel"). Ini menciptakan pengikatan yang tidak dapat diubah, yaitu Anda tidak dapat menetapkan nilai baru untuk pengikatan.Object.freeze
bekerja pada nilai , dan lebih khusus lagi, nilai objek . Itu membuat objek tidak berubah, yaitu Anda tidak dapat mengubah propertinya.sumber
const
ini adalah yang baruvar
; itu hanya dicekal dan mencegah penugasan kembali. Anda dapat menggunakanlet
, tetapi benar-benar hanya perlu jika Anda akan mengubah nilai yang ditunjuk suatu variabel, yang masuk akal untuk variabel kontrol loop / iterator dan tipe sederhana seperti angka dan string, tetapi tidak untuk sebagian besar penggunaan objek (termasuk array). Jika Anda menginginkan objek / array yang isinya tidak dapat diubah, maka selain menyatakannya,const
Anda juga harus memanggilnyaObject.freeze()
.const
BUKAN yang baruvar
,let
adalah yang baruvar
Dalam ES5
Object.freeze
tidak bekerja pada primitif, yang mungkin akan lebih sering dinyatakan menggunakanconst
objek. Anda dapat membekukan primitif di ES6, tetapi kemudian Anda juga memiliki dukungan untukconst
.Di sisi lain yang
const
digunakan untuk mendeklarasikan objek tidak "membekukan" mereka, Anda tidak bisa mendeklarasikan ulang seluruh objek, tetapi Anda dapat memodifikasi kuncinya secara bebas. Di sisi lain Anda dapat mendeklarasikan ulang objek yang beku.Object.freeze
juga dangkal, jadi Anda harus menerapkannya secara rekursif pada objek bersarang untuk melindunginya.sumber
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
: Apakah karena ruang lingkup metode ini?Ringkasan:
const
danObject.freeze()
melayani tujuan yang sama sekali berbeda.const
ada untuk mendeklarasikan variabel yang harus ditanggapi segera dan tidak dapat dipindahkan. variabel yang dideklarasikan olehconst
adalah scoped blok dan bukan fungsi scoped seperti variabel yang dideklarasikan denganvar
Object.freeze()
adalah metode yang menerima objek dan mengembalikan objek yang sama. Sekarang objek tidak dapat menghapus semua propertinya atau properti baru apa pun yang ditambahkan.Contoh
const
:Contoh 1: Tidak dapat menetapkan ulang
const
Kode berikut memunculkan kesalahan karena kami mencoba menetapkan ulang variabel foo yang dideklarasikan dengan
const
kata kunci, kami tidak dapat menetapkannya kembali.Contoh 2: Struktur data yang ditugaskan untuk
const
dapat dimutasiDalam contoh ini kita mendeklarasikan variabel menggunakan
const
kata kunci dan menetapkan objek untuk itu. Meskipun kami tidak dapat menetapkan kembali objek yang disebut variabel ini, kami dapat mengubah objek itu sendiri. Jika kami mengubah properti yang ada atau menambahkan properti baru, ini akan berpengaruh. Untuk menonaktifkan segala perubahan pada objek yang kita butuhkanObject.freeze()
.Contoh
Object.freeze()
:Contoh 1: Tidak dapat bermutasi objek beku
Dalam contoh ini ketika kita memanggil
Object.freeze()
dan memberikanobject1
sebagai argumen, fungsi mengembalikan objek yang sekarang 'beku'. Jika kita membandingkan referensi objek baru ke objek lama menggunakan===
operator, kita dapat mengamati bahwa mereka merujuk ke objek yang sama. Juga ketika kita mencoba untuk menambah atau menghapus properti apa pun kita dapat melihat bahwa ini tidak memiliki efek apa pun (akan melempar kesalahan dalam mode ketat).Contoh 2: Objek dengan referensi tidak sepenuhnya dibekukan
Contoh ini menunjukkan bahwa properti objek bersarang (dan lainnya dengan struktur data referensi) masih bisa berubah . Jadi
Object.freeze()
tidak sepenuhnya 'membekukan' objek ketika memiliki properti yang merupakan referensi (misalnya Array, Objek).sumber
Contoh di atas benar-benar membuat objek Anda tidak berubah.
Mari kita lihat contoh berikut.
Itu tidak akan memberikan kesalahan.
Tetapi jika Anda mencoba seperti itu
Ini akan melempar kesalahan seperti itu "obj read-only".
Kasus penggunaan lain
Itu akan melempar
Duplicate declaration "obj"
Juga menurut penjelasan const const mozilla
Contoh-contoh ini dibuat sesuai dengan fitur babeljs ES6.
sumber
Biar sederhana.
Mereka berbeda. Periksa komentar pada kode, yang akan menjelaskan setiap kasus.
Const
- Ini adalah variabel lingkup blok sepertilet
, yang nilainya tidak dapat dipindahkan, dinyatakan kembali.Itu berarti
Pemahaman keseluruhan adalah bahwa const adalah lingkup blok dan nilainya tidak ditugaskan kembali.
Object.freeze
: Properti root objek tidak dapat diubah, juga kita tidak dapat menambah dan menghapus lebih banyak properti tetapi kita dapat menugaskan kembali seluruh objek.// Satu hal yang serupa di keduanya adalah, objek bersarang bisa berubah
Terima kasih.
sumber