Ringkasan saya tentang satu kalimat: Nilai asli tidak akan mengubah nilai asli terlepas dari apakah itu adalah penugasan variabel atau umpan fungsi. Apakah itu adalah penugasan variabel atau umpan fungsi, jika variabel baru dipindahkan, itu tidak akan mempengaruhi nilai referensi asli. Jika variabel baru adalah operasi langsung, itu akan mempengaruhi nilai referensi asli.
Pertama -tama, jelas bahwa nilai dan jenis adalah dua konsep yang berbeda. Misalnya, nol adalah nilai unik dari tipe nol, tidak terdefinisi adalah nilai unik dari tipe yang tidak ditentukan, dan benar dan salah adalah satu -satunya dua nilai tipe boolean, dll. Dalam bahasa apa pun, operasi nilai dapat diringkas ke dalam 3 aspek berikut.
Nilai Salin: Artinya, tetapkan nilai ke variabel baru, atau tetapkan nilai ke variabel lain, atribut atau elemen array melalui variabel.
Nilai lewat: yaitu, melewati nilai sebagai parameter ke fungsi atau metode.
Bandingkan nilai: yaitu, bandingkan nilai dengan nilai lain untuk melihat apakah itu sama.
Karena nilai data jenis nilai dan data referensi memiliki bentuk yang berbeda, metode mengoperasikannya secara alami dan hasil yang dihasilkan juga berbeda. Perhatikan bahwa ketika nilai adalah data tipe nilai, kami sering menyebutnya nilai asli atau nilai dasar; Ketika nilai adalah data yang direferensikan, kami sering menyebutnya nilai yang dirujuk atau nilai komposit.
1. Gunakan nilai asli
Untuk nilai asli, tiga tingkat operasinya dijelaskan sebagai berikut.
1) Salin nilainya
Dalam pernyataan penugasan, proses operasi akan menghasilkan salinan nilai aktual. Tidak ada hubungan antara nilai salinan dan nilai aktual. Mereka terletak di berbagai area tumpukan atau area tumpukan saja. Salinan ini dapat menyimpan variabel, properti objek, dan elemen array. Misalnya:
var n = 123, a, b = [], c = {}; a = n; // Salin angka 123 b [0] = n; // Salin angka 123 cx = n; // Salin angka 123 (a == b [0]) && (a == cx) && (b [0] == cx) && peringatan ("Nilai yang disalin sama"); // deteksi bahwa nilainya samaDalam contoh di atas, nilai 123 masing -masing disalin 3 salinan ke variabel A, array B dan objek C. Meskipun nilai -nilai mereka sama, mereka independen satu sama lain.
2) Lewati nilainya
Saat meneruskan nilai ke fungsi atau metode, nilai yang ditularkan hanya salinan, bukan nilai itu sendiri. Misalnya, jika Anda memodifikasi nilai yang ditularkan dalam suatu fungsi, hasilnya hanya dapat mempengaruhi salinan nilai parameter ini dan tidak akan mempengaruhi nilai asli.
var a = 123; // fungsi nilai asli f (x) {x = x + x; } f (a); // Panggil fungsi untuk memodifikasi peringatan nilai yang dilewati (a); // Periksa apakah nilai variabel A terpengaruh. Nilai pengembalian adalah 123, menunjukkan bahwa tidak ada perubahan3) Nilai perbandingan
Dalam contoh di atas kita juga dapat melihat bahwa ketika membandingkan nilai asli, perbandingan byte-byte dilakukan untuk menentukan apakah mereka sama. Membandingkan nilai -nilai itu sendiri, bukan lokasi di mana nilainya berada. Meskipun hasil perbandingan mungkin sama, itu hanya berarti bahwa informasi byte yang dikandungnya adalah sama.
2. Gunakan nilai referensi
Untuk nilai referensi, tiga tingkat operasi mereka dijelaskan sebagai berikut.
1) Salin nilainya
Dalam pernyataan penugasan, nilai yang ditetapkan adalah referensi ke nilai asli, bukan salinan nilai asli, atau nilai asli itu sendiri. Dengan kata lain, setelah penugasan dilakukan, variabel menyimpan referensi ke nilai asli (yaitu, alamat penyimpanan dari nilai asli). Ketika disalin di antara beberapa variabel, elemen array, atau properti objek, semuanya akan sama dengan referensi yang disimpan oleh variabel asli.
Semua referensi memiliki efek dan fungsi yang sama dan dapat dilakukan. Jika data diedit melalui salah satu referensi, modifikasi ini akan tercermin dalam nilai asli dan referensi terkait lainnya. Misalnya:
var a = [1,2,3]; // Tetapkan referensi array b = a; // Salin nilai B [0] = 4; // Ubah nilai elemen pertama dalam peringatan v variabel (a [0]); // return 4, menampilkan nilai elemen pertama dalam variabel A juga dimodifikasi menjadi 4
Namun, jika nilai baru dipindahkan ke variabel B, nilai baru tidak akan mempengaruhi konten nilai aslinya. Misalnya:
var a = [1,2,3]; // Tetapkan referensi array b = a; // Salin nilai b = 4; // timpa peringatan penugasan (A [0]); // Isi variabel A tetap tidak berubah
Tugas yang diulang sebenarnya mengesampingkan referensi variabel ke nilai asli, menjadi salinan nilai lain atau referensi untuk itu. Oleh karena itu, itu tidak akan mempengaruhi nilai asli, dan diagram demonstrasi ditunjukkan pada Gambar 4-2.
2) Lewati nilainya
Ketika referensi digunakan untuk meneruskan data ke suatu fungsi, yang diteruskan ke fungsi juga merupakan referensi ke nilai asli. Fungsi dapat menggunakan referensi ini untuk memodifikasi nilai asli itu sendiri, dan modifikasi apa pun terlihat di luar fungsi. Misalnya:
var a = [1,2,3]; fungsi f (x) {x [0] = 4; // Ubah nilai parameter dalam fungsi} f (a); // Lewati peringatan nilai referensi (A [0]); // return 4, nilai asli berubahPerhatikan bahwa apa yang dimodifikasi di dalam fungsi adalah referensi ke objek atau array eksternal, bukan nilai objek atau array itu sendiri. Anda dapat menggunakan referensi untuk memodifikasi atribut suatu objek atau elemen array dalam fungsi, tetapi jika referensi baru digunakan di dalam fungsi untuk menimpa referensi asli, maka modifikasi di dalam fungsi tidak akan mempengaruhi nilai referensi asli dan tidak dapat dilihat di luar fungsi.
var a = [1,2,3]; fungsi f (x) {x = 4; // Ubah nilai parameter dalam fungsi} f (a); // Lewati peringatan nilai referensi (A [0]); // return 1, nilai asli tidak akan berubah3) Nilai perbandingan
Ketika membandingkan dua nilai referensi, dua alamat referensi dibandingkan dengan melihat apakah nilai asli yang mereka referensi adalah salinan yang sama, daripada apakah nilai aslinya sama dengan byte. Ketika merujuk dua nilai yang berbeda, meskipun mereka memiliki komposisi byte yang sama, nilai -nilai dari dua referensi tidak sama.
var a = angka baru (1); // Nilai referensi A var b = angka baru (1); // nilai referensi b var c = a; // Tetapkan referensi ke C Alert (A == B); // mengembalikan peringatan palsu (a == c); // Kembalikan true
Jadi, {} == {}, [] == [], semua mengembalikan false. Karena alamat referensi berbeda.
Singkatnya, untuk bahasa apa pun, menggunakan nilai dan menggunakan referensi adalah dua metode dasar manipulasi data. Ketika kami mengoperasikan data, metode apa yang harus digunakan untuk memprosesnya terutama tergantung pada jenis data. Jenis nilai dan data referensi berpartisipasi dalam operasi berbeda. Jenis nilai data beroperasi pada data dengan menggunakan nilai, sementara data referensi beroperasi pada data menggunakan referensi. Metode perhitungan yang berbeda juga menghasilkan hasil yang berbeda secara alami. Mari kita lihat contoh lain:
var s = "ABC"; // String, Jenis Nilai Data var O = String baru; // Objek String, Fungsi String Kotak F (V) {// Fungsi Operasi v.ToString = function () {// Metode ToString toString () return 123; }; } f (s); // Lewati peringatan nilai; // Kembalikan string "ABC", yang menunjukkan bahwa operasi tidak mempengaruhi data asli f (o); // Lewati peringatan referensi (o); // Kembalikan nilai 123, menunjukkan bahwa operasi telah mempengaruhi struktur internal data asliJenis nilai berpartisipasi dalam operasi dengan nilai aktual, sehingga tidak memiliki koneksi langsung dengan data asli. Jenis referensi berpartisipasi dalam operasi dengan alamat referensi, dan hasil perhitungan akan mempengaruhi blok data area heap yang terkait dengan alamat referensi. Namun, ada satu pengecualian. Untuk string JavaScript, metode operasinya relatif rumit. Silakan google untuk detailnya!
Artikel di atas JavaScript Data Operation_A Diskusi singkat tentang esensi operasi nilai asli dan nilai referensi adalah semua konten yang saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.