Mutability ialah keupayaan untuk mengubah sesuatu nilai. Nilai boleh ubah boleh ditukar, dan nilai tidak berubah tidak boleh diubah. Salah tanggapan yang lazim ialah kata kunci "const" menjadikan pembolehubah tidak berubah.
Sebenarnya, "const" hanya menghalang penugasan semula. Untuk jenis bukan objek, nilai hanya boleh ditukar melalui penugasan semula, jadi mengisytiharkannya dengan "const" sebenarnya menjadikannya tidak boleh diubah. Pertimbangkan, sebagai contoh, kod berikut:
const num = 5; num = 7; // illegal reassignment of const variable
Tiada cara untuk menukar nilai num dalam kod ini. Ambil perhatian bahawa menggunakan ++ atau -- masih dianggap sebagai penugasan semula dan itu ditunjukkan dalam mesej ralat jika kami cuba menggunakannya pada pembolehubah yang diisytiharkan dengan const.
const num = 5; num++;//illegal reassignment of constant
Ralat yang terhasil ialah:
Uncaught TypeError: Assignment to constant variable.
Objek pada asasnya berbeza dalam hal kebolehubahan kerana nilainya boleh berubah tanpa penugasan semula pembolehubah. Ambil perhatian bahawa penugasan semula hartanah tidak dihalang oleh "const". Hanya nama pembolehubah dihalang daripada penugasan semula.
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
Objek juga boleh mempunyai kaedah yang mengubah nilai dalaman.
const obj = { num: 5, increment(){ this.num++; } } obj.increment(); console.log(obj.num); //6
Adalah mungkin untuk menjadikan objek benar-benar tidak berubah dengan mengisytiharkannya dengan "const" dan menggunakan Object.freeze().
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
Perhatikan bahawa jika kami menggunakan mod ketat, percubaan untuk menukar nilai num sebenarnya akan menyebabkan ranap dengan mesej ralat berikut:
Cannot assign to read only property 'num'
Penggunaan Object.freeze() tanpa "const" sudah memadai untuk menjadikan objek ini tidak berubah. Walau bagaimanapun, ia tidak menjadikan nama pembolehubah tidak boleh diubah.
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
Apa yang berlaku dalam versi kod ini ialah obj ditugaskan semula. Pembekuan() telah digunakan pada objek sebelumnya yang berkongsi nama yang sama, tetapi objek baharu itu tidak pernah dibekukan, jadi ia boleh berubah.
Ada kalanya anda mungkin mahu membenarkan nilai dalam objek berubah, tetapi anda tidak mahu membenarkan menambah atau mengalih keluar sifat. Ini boleh dicapai dengan menggunakan Object.seal().
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
Pembekuan dan pengedap dikenakan pada keseluruhan objek. Jika anda ingin membuat sifat tertentu tidak berubah, itu boleh dilakukan menggunakan defineProperty() atau defineProperties(). Pilihan antara kedua-dua ini bergantung pada jika anda ingin mempengaruhi satu harta atau berbilang sifat.
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
Sifat baharu sedang ditakrifkan dalam contoh ini, tetapi defineProperty() juga boleh digunakan pada harta sedia ada. Ambil perhatian bahawa jika "boleh dikonfigurasikan" sebelum ini ditetapkan kepada palsu, ia tidak boleh ditukar kepada benar, tetapi jika ia pada asalnya benar, ia boleh ditetapkan kepada palsu, kerana perubahan ini dikira sebagai jenis konfigurasi.
Dalam kebanyakan kes, anda tidak perlu menjamin bahawa objek tidak boleh diubah. Apabila keperluan sedemikian timbul, secara amnya ia mencukupi untuk membekukan objek, tetapi kami mempunyai pilihan tambahan untuk kawalan yang lebih halus jika keperluan sedemikian timbul.
Atas ialah kandungan terperinci Kebolehubahan Objek dalam Javascript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!