Hari ini saya menjawab pertanyaan tentang JavaScript, yang melibatkan masalah penugasan, jadi saya ingin meringkas masalah ini dengan cermat.
Salinan kode adalah sebagai berikut:
var a = 'tes';
var b = function () {};
ba = 'tes';
perubahan fungsi (m, n) {
m = 'ubah';
na = 'ubah';
}
Ubah (a, b);
Apakah nilai variabel A dan B akan berubah setelah menjalankan kode di atas?
Nilai asli dan direferensikan
Saya telah memperkenalkan nilai asli dan nilai referensi dalam artikel sebelumnya. Nilai asli mengacu pada tidak terdefinisi, nol, boolean, angka, string, dll., Yang disimpan pada tumpukan, sedangkan nilai referensi diintegrasikan dari objek, yang disimpan dalam tumpukan.
Di sini kita perlu membedakan keduanya:
Salinan kode adalah sebagai berikut:
var a = 'tes';
var b = string baru ('tes');
var a = 'true';
var b = boolean baru ('true');
Untuk empat variabel di atas, A dan A adalah nilai asli, sedangkan B dan B adalah nilai referensi.
Mekanisme penugasan
Setelah mengklarifikasi perbedaan antara nilai asli dan nilai referensi, Anda dapat memperkenalkan mekanisme penugasan JavaScript secara rinci:
Dalam JavaScript, setiap penugasan akan menghasilkan salinan untuk variabel jenis nilai asli, dan untuk nilai yang dirujuk, sebagai namanya, ditugaskan dengan mengacu pada memori objek penyimpanan yang sama.
Penugasan Nilai Asli:
Salinan kode adalah sebagai berikut:
var a = 1; // nilai asli
var b = a; // menghasilkan salinan ke variabel b
b = 2; // tidak terkait dengan a
peringatan (a); // output 1
Penugasan nilai yang direferensikan:
Salinan kode adalah sebagai berikut:
var a = objek baru (); // nilai referensi
Kapak = 1;
var b = a; // penugasan referensi, menunjuk ke memori yang sama
Bx = 2; // Modifikasi B akan mempengaruhi a
peringatan (kapak); // output 2
Parameter Pass
Sekarang mari kita lihat cara menangani melewati dua jenis nilai ke parameter fungsi secara bersamaan.
1. Lewati Nilai Asli
Salinan kode adalah sebagai berikut:
var a = 1;
tes fungsi (m) {
m = 2;
}
tes (a);
peringatan (a); // output 1
Outputnya adalah 1, jadi kita tahu bahwa fungsi hanya melewati nilai variabel dalam, jadi m di badan fungsi mendapatkan nilai 1 dan ditugaskan ke 2. Proses ini tidak mempengaruhi variabel eksternal a.
2. Lewati nilai referensi
Salinan kode adalah sebagai berikut:
var a = objek baru ();
Kapak = 1
tes fungsi (m) {
Mx = 2;
}
tes (a);
peringatan (kapak); // output 2
Outputnya adalah 2, jadi kita tahu bahwa fungsi melewati alamat variabel dalam, jadi m di badan fungsi mendapatkan alamat yang disahkan. Oleh karena itu, ketika atribut X ditugaskan ke 2, itu juga akan mempengaruhi penunjuk ke alamat memori yang sama.
Meringkaskan
Sekarang mari kita kembali ke pertanyaan pembukaan:
Salinan kode adalah sebagai berikut:
var a = 'tes';
var b = function () {};
ba = 'tes';
perubahan fungsi (m, n) {
m = 'ubah';
na = 'ubah';
}
Ubah (a, b);
Variabel A adalah nilai asli, variabel B adalah nilai referensi, dan satu diteruskan ke badan fungsi sebagai nilai dan yang lainnya adalah alamatnya, jadi setelah fungsi dijalankan, variabel A tidak akan berubah, dan nilai variabel B akan berubah.