Rumah > hujung hadapan web > tutorial js > Mengapa kita tidak dapat membandingkan tatasusunan dan objek dengan ===

Mengapa kita tidak dapat membandingkan tatasusunan dan objek dengan ===

DDD
Lepaskan: 2025-01-29 20:37:08
asal
506 orang telah melayarinya

Why can’t we compare arrays and objects with ===

Artikel ini meneroka soalan JavaScript biasa: Mengapa pengendali kesamaan ketat () tidak berfungsi seperti yang diharapkan apabila membandingkan array dan objek. Kami akan menyelidiki kerja dalaman JavaScript untuk memahami tingkah laku ini.

=== JavaScript membezakan antara jenis data primitif dan bukan primitif. Jenis primitif (Boolean, Null, Undefined, String, Number) diluluskan dengan nilai, manakala jenis bukan primitif (tatasusunan, fungsi, dan objek-semua objek teknikal) diluluskan dengan rujukan.

tingkah laku jenis primitif (lulus nilai)

Apabila anda mengisytiharkan pemboleh ubah primitif, nilai disimpan secara langsung:

tingkah laku jenis bukan primitif (lulus dengan rujukan)

pembolehubah tidak primitif menyimpan rujukan ke lokasi memori objek, bukan objek itu sendiri:

<code class="language-javascript">const name = 'John';
const age = 25;</code>
Salin selepas log masuk

Pada mulanya, fruits memegang rujukan (mis., Alamat memori H001) menunjuk kepada array kosong. Selepas push(), array di H001 diubahsuai.

Penyalinan rujukan

Apabila anda menyalin pembolehubah rujukan menggunakan =, anda menyalin rujukan, bukan data objek:

<code class="language-javascript">const fruits = [];
fruits.push('Banana');</code>
Salin selepas log masuk

kedua -dua fruits dan yellowFruits kini menunjuk ke lokasi memori yang sama. Mengubahsuai satu mengubah yang lain.

menambah 'nanas' ke yellowFruits juga berubah fruits kerana mereka berkongsi rujukan yang sama.

Menetapkan semula pembolehubah rujukan

menugaskan semula pemboleh ubah rujukan mencipta rujukan baru:

<code class="language-javascript">const fruits = ['Banana'];
const yellowFruits = fruits;</code>
Salin selepas log masuk

Objek asal { name: 'John' } kekal dalam ingatan, tetapi person kini menunjuk ke objek baru { name: 'Mary' }.

kenapa === gagal dengan tatasusunan dan objek

operator membandingkan rujukan untuk jenis bukan primitif. Oleh itu: ===

<code class="language-javascript">let person = { name: 'John' };
person = { name: 'Mary' };</code>
Salin selepas log masuk
Walaupun

dan arr1 mempunyai kandungan yang sama, mereka mempunyai alamat memori yang berbeza, menghasilkan arr3. false

Parameter fungsi dan kesucian

Lulus nilai primitif ke fungsi menyalin nilai. Walau bagaimanapun, objek lulus melepasi rujukan. Perbezaan ini penting untuk memahami fungsi tulen dan tidak suci.

  • fungsi tulen: Jangan mengubah keadaan luaran. Mereka beroperasi semata -mata pada input mereka dan menghasilkan output yang boleh diramal.
  • Fungsi yang tidak suci: boleh mengubahsuai objek yang diluluskan sebagai argumen, yang mempengaruhi objek asal di luar skop fungsi.
Untuk membuat fungsi tulen yang mengubah objek, buat salinan sebelum pengubahsuaian:

<code class="language-javascript">const arr1 = ['1'];
const arr2 = arr1;  // Same reference

console.log(arr1 === arr2); // true

const arr3 = ['1']; // Different reference
console.log(arr1 === arr3); // false</code>
Salin selepas log masuk

Secara ringkas

    Jenis primitif diluluskan oleh nilai; Jenis bukan primitif diluluskan dengan rujukan.
  1. membandingkan rujukan untuk jenis bukan primitif. ===
  2. Memahami penyalinan rujukan adalah penting untuk menulis kod yang boleh diramal dan boleh dipelihara.
  3. fungsi tulen Elakkan kesan sampingan dengan tidak mengubah keadaan luaran.
untuk menyelam lebih mendalam ke dalam pengurusan memori JavaScript, meneroka timbunan panggilan dan timbunan ingatan.

Atas ialah kandungan terperinci Mengapa kita tidak dapat membandingkan tatasusunan dan objek dengan ===. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan