Ini berarti bahwa setelah Anda membuat instance objek, Anda tidak dapat mengubah propertinya. Dalam peringatan pertama Anda, Anda tidak mengubah foo. Anda membuat string baru. Inilah sebabnya mengapa pada peringatan kedua Anda akan menampilkan "foo", bukan oo.
Apakah itu berarti, ketika memanggil metode pada sebuah string, itu akan mengembalikan string yang dimodifikasi, tetapi tidak akan mengubah string awal?
Iya. Tidak ada yang bisa mengubah string setelah dibuat. Sekarang ini tidak berarti bahwa Anda tidak dapat menetapkan objek string baru ke str
variabel. Anda tidak bisa mengubah objek saat ini yang dirujuk str.
Jika string itu bisa berubah, apakah itu berarti peringatan ke-2 () akan mengembalikan oo juga?
Secara teknis, tidak, karena metode substring mengembalikan string baru. Membuat objek bisa berubah, tidak akan mengubah metode. Membuatnya bisa berubah berarti secara teknis, Anda bisa membuatnya sehingga substring akan mengubah string asli daripada membuat yang baru.
Pada tingkat yang lebih rendah, kekekalan berarti bahwa memori tempat string disimpan tidak akan diubah. Setelah Anda membuat string
"foo"
, beberapa memori dialokasikan untuk menyimpan nilainya"foo"
. Memori ini tidak akan diubah. Jika Anda memodifikasi string dengan, katakanlah,substr(1)
string baru dibuat dan bagian memori yang berbeda dialokasikan yang akan disimpan"oo"
. Sekarang Anda memiliki dua string dalam memori,"foo"
dan"oo"
. Bahkan jika Anda tidak akan menggunakannya"foo"
lagi, itu akan bertahan sampai sampah dikumpulkan.Salah satu alasan mengapa operasi string relatif mahal.
sumber
Tidak dapat diubah artinya yang tidak dapat diubah atau dimodifikasi.
Jadi ketika Anda menetapkan nilai ke string, nilai ini dibuat dari awal sebagai lawan diganti. Jadi setiap kali nilai baru diberikan ke string yang sama, salinan dibuat. Jadi kenyataannya, Anda tidak pernah mengubah nilai aslinya.
sumber
Saya tidak yakin tentang JavaScript, tetapi di Java, string mengambil langkah tambahan menuju keabadian, dengan "String Constant Pool". String dapat dibangun dengan string literals (
"foo"
) atau denganString
konstruktor kelas. String yang dibuat dengan string literal adalah bagian dari String Constant Pool, dan string literal yang sama akan selalu menjadi alamat memori yang sama dari kumpulan tersebut.Contoh:
Di atas, keduanya
lit1
danlit2
dibangun menggunakan string literal yang sama, jadi mereka menunjuk ke alamat memori yang sama;lit1 == lit2
menghasilkantrue
, karena mereka adalah objek yang persis sama.Namun,
cons
dibangun menggunakan konstruktor kelas. Meskipun parameternya adalah konstanta string yang sama, konstruktor mengalokasikan memori baru untukcons
, artinyacons
bukan objek yang sama denganlit1
danlit2
, meskipun berisi data yang sama.Tentu saja, karena ketiga string semuanya berisi data karakter yang sama, menggunakan
equals
metode ini akan mengembalikan nilai true.(Kedua jenis konstruksi senar tidak dapat diubah, tentu saja)
sumber
Immutable artinya nilainya tidak bisa diubah. Setelah dibuat, objek string tidak dapat dimodifikasi karena tidak dapat diubah. Jika Anda meminta substring dari sebuah string, String baru dengan bagian yang diminta dibuat.
Menggunakan StringBuffer sambil memanipulasi Strings malah membuat operasi lebih efisien karena StringBuffer menyimpan string dalam larik karakter dengan variabel untuk menampung kapasitas larik karakter dan panjang larik (String dalam bentuk larik karakter)
sumber
Definisi mutabilitas dalam buku teks bertanggung jawab atau dapat berubah atau diubah. Dalam pemrograman, kami menggunakan kata tersebut untuk mengartikan objek yang statusnya diizinkan untuk berubah seiring waktu. Nilai yang tidak berubah adalah kebalikannya - setelah dibuat, nilai tidak akan pernah bisa berubah.
Jika ini tampak aneh, izinkan saya mengingatkan Anda bahwa banyak nilai yang kita gunakan sepanjang waktu ternyata tidak dapat diubah.
Saya pikir tidak ada yang akan terkejut mengetahui bahwa baris kedua sama sekali tidak mengubah string dalam pernyataan. Faktanya, tidak ada metode string yang mengubah string tempat mereka beroperasi, mereka semua mengembalikan string baru. Alasannya adalah karena string tidak dapat diubah - string tidak dapat berubah, kita hanya dapat membuat string baru.
String bukan satu-satunya nilai tetap yang dibangun ke dalam JavaScript. Angka juga tidak bisa diubah. Dapatkah Anda membayangkan lingkungan di mana mengevaluasi ekspresi 2 + 3 mengubah arti angka 2? Kedengarannya tidak masuk akal, namun kami melakukan ini dengan objek dan array kami sepanjang waktu.
sumber
Dari string ke tumpukan ... contoh sederhana untuk dipahami diambil dari blog Eric Lippert :
Pencarian Jalur Menggunakan A * di C # 3.0, Bagian Kedua ...
Untuk lebih dalam memahami keabadian, baca posting Eric dimulai dengan yang ini:
Kekekalan dalam C # Bagian Satu: Jenis Kekekalan
sumber
Salah satu cara untuk memahami konsep ini adalah dengan melihat bagaimana javascript memperlakukan semua objek, yaitu dengan referensi. Artinya semua objek dapat berubah setelah dibuat instance-nya, ini berarti Anda dapat menambahkan objek dengan metode dan properti baru. Ini penting karena jika Anda ingin objek menjadi tidak berubah, objek tidak dapat berubah setelah dibuat instance-nya.
sumber