Lulus mengikut nilai VS. Lulus dengan rujukan
Panggilan mengikut nilai ialah strategi penilaian yang paling biasa digunakan: parameter formal fungsi ialah salinan parameter sebenar yang diluluskan apabila dipanggil. Menukar nilai parameter formal tidak menjejaskan parameter sebenar.
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:
Di sini kita boleh lihat:
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.
Lihat objek sekali lagi:
Jelaskan bahawa o dan obj ialah objek yang sama, dan o bukan salinan obj. Jadi ia tidak diluluskan oleh nilai. Tetapi adakah ini bermakna objek JS diluluskan dengan rujukan? Mari lihat contoh berikut:
Jika ia diluluskan melalui rujukan, mengubah suai nilai parameter formal o harus mempengaruhi parameter sebenar. Tetapi mengubah suai nilai o di sini tidak menjejaskan obj. Oleh itu objek dalam JS tidak diluluskan dengan rujukan. Jadi bagaimanakah nilai objek dipindahkan dalam JS?
hubungi dengan berkongsi
Lebih tepatnya, jenis asas dalam JS diluluskan mengikut nilai, dan jenis objek diluluskan dengan perkongsian (panggilan dengan perkongsian, juga dipanggil lulus dengan objek dan lulus dengan 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.
Namun, 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.
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;
Mengikut strategi penilaian pass-by-share, a dan b ialah dua rujukan berbeza (b ialah salinan rujukan a), tetapi merujuk kepada nilai yang sama. Oleh kerana jenis asas nombor 1 di sini tidak boleh diubah, tidak ada perbezaan antara lulus mengikut nilai dan lulus dengan berkongsi.
Sifat tidak berubah jenis asas
Jenis asas tidak boleh diubah (tidak boleh diubah), hanya objek boleh berubah (boleh berubah Sebagai contoh, nilai berangka 100, nilai Boolean benar, salah, mengubah suai nilai ini (seperti menukar 1 kepada 3, menukar benar kepada 100). ) tidak Apakah maksudnya. 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.