


Perbincangan sama ada nilai dalam JavaScript diluluskan oleh nilai atau oleh kemahiran reference_javascript
May 16, 2016 pm 04:16 PMSaya menemui soalan yang menarik baru-baru ini: "Adakah nilai dalam JS diluluskan mengikut nilai atau rujukan?"
Sebelum menganalisis masalah ini, kita perlu memahami apa yang dipanggil dengan nilai dan apa yang dipanggil dengan rujukan. Dalam sains komputer, bahagian ini dipanggil Strategi Penilaian. Ia menentukan cara nilai dihantar antara pembolehubah dan antara parameter sebenar dan parameter formal apabila fungsi dipanggil.
Lulus mengikut nilai VS. Lulus dengan rujukan
Apabila melalui rujukan (panggilan melalui rujukan), parameter formal fungsi menerima rujukan tersirat kepada parameter sebenar, bukannya salinan. Ini bermakna jika nilai parameter fungsi diubah, parameter sebenar juga akan diubah suai. Pada masa yang sama kedua-duanya menunjukkan nilai yang sama.
Melewati rujukan menjadikannya lebih sukar untuk mengesan panggilan fungsi dan kadangkala menyebabkan pepijat halus.
Melepasi nilai memerlukan klon setiap kali, jadi prestasi lebih rendah untuk beberapa jenis yang kompleks. Kedua-dua kaedah lulus nilai mempunyai masalah mereka sendiri.
Mari kita lihat contoh C untuk memahami perbezaan antara lulus mengikut nilai dan rujukan:
{
p = 27; // Nilai lulus – p ialah salinan parameter sebenar a, hanya p diubah suai
*q = 27; // q ialah rujukan kepada b, kedua-dua q dan b diubah suai
}
int main()
{
int a = 1;
int b = 1;
Ubah suai(a, &b); // a diluluskan dengan nilai, b diluluskan dengan rujukan,
// a tidak berubah, b telah berubah
Pulangan(0);
}
a => Apabila p diluluskan dengan nilai, mengubah suai nilai parameter formal p tidak menjejaskan parameter sebenar a, iaitu hanya salinan a.
b => q diluluskan melalui rujukan Mengubah suai nilai parameter formal q juga mempengaruhi nilai parameter sebenar b.
Terokai cara nilai JS diluluskan
Jenis asas JS diluluskan mengikut nilai.
fungsi foo(x) {
x = 2;
}
foo(a);
console.log(a); // Masih 1, tidak terjejas oleh tugasan x = 2
fungsi foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, diubah suai!
fungsi foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // Masih 1, obj belum diubah suai kepada 100.
panggil dengan berkongsi Secara tepatnya, jenis asas dalam JS dihantar mengikut nilai dan jenis objek diluluskan dengan perkongsian (panggilan dengan perkongsian, juga dipanggil melalui objek dan lulus melalui perkongsian objek). Ia pertama kali dicadangkan oleh Barbara Liskov dalam bahasa GLU pada tahun 1974. Strategi penilaian ini digunakan dalam Python, Java, Ruby, JS dan bahasa lain.
Perkara utama strategi ini ialah: apabila memanggil fungsi untuk menghantar parameter, fungsi menerima salinan rujukan hujah objek (bukan salinan objek yang diluluskan mengikut nilai, mahupun rujukan tersirat yang diluluskan melalui rujukan). Perbezaan antaranya dan lulus melalui rujukan ialah penetapan parameter fungsi dalam pemindahan kongsi tidak akan menjejaskan nilai parameter sebenar. Seperti dalam contoh berikut, nilai obj tidak boleh diubah suai dengan mengubahsuai nilai parameter formal o.
var obj = {x : 1};
fungsi foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // Masih 1, obj belum diubah suai kepada 100.
Walau bagaimanapun, walaupun rujukan adalah salinan, objek yang dirujuk adalah sama. Mereka berkongsi objek yang sama, jadi mengubah suai nilai harta objek parameter formal juga akan mempengaruhi nilai harta parameter sebenar.
var obj = {x : 1};
fungsi foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, diubah suai!
Untuk jenis objek, memandangkan objek boleh berubah, mengubah suai objek itu sendiri akan menjejaskan rujukan dan salinan rujukan yang berkongsi objek. Bagi jenis asas, kerana mereka semua tidak berubah, tidak ada perbezaan antara lulus dengan berkongsi dan lulus dengan nilai (panggilan mengikut nilai Oleh itu, jenis asas JS mematuhi kedua-dua lulus dengan nilai dan lulus dengan perkongsian).
var a = 1; // 1 ialah jenis nombor, var b = a;
Sifat tidak berubah jenis asas Jenis asas tidak boleh diubah (tidak boleh berubah), hanya objek boleh berubah (boleh berubah Sebagai contoh, nilai berangka 100, nilai Boolean benar, salah, ubah suai nilai ini (contohnya, tukar 1 kepada 3, tukar). benar kepada 100 ) tidak mempunyai makna. Apa yang lebih mudah untuk salah faham ialah rentetan dalam JS. Kadangkala kami cuba "menukar" kandungan rentetan, tetapi dalam JS, sebarang operasi yang kelihatan "mengubah suai" nilai rentetan sebenarnya mencipta nilai rentetan baharu.
str[0]; // "a"
str[0] = “d”;
str; // Masih "abc"; Tiada cara untuk mengubah suai kandungan rentetan
obj.x = 100;
var o = obj;
o.x = 1;
obj.x; // 1, diubah suai
o = benar;
obj.x; // 1, tidak akan berubah kerana o = true

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Bagaimana untuk melaksanakan sistem pengecaman pertuturan dalam talian menggunakan WebSocket dan JavaScript

WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata

Bagaimana untuk melaksanakan sistem tempahan dalam talian menggunakan WebSocket dan JavaScript

Cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap

Tutorial JavaScript Mudah: Cara Mendapatkan Kod Status HTTP

Bagaimana untuk mendapatkan kod status HTTP dalam JavaScript dengan cara yang mudah

Bagaimana untuk menggunakan insertBefore dalam javascript
