Adakah (a== 1 && a ==2 && a==3) Pernah Benar?
Soalan:
Bolehkah ungkapan (a== 1 && a ==2 && a==3) pernah menilai benar dalam JavaScript, walaupun terdapat ketidakkonsistenan logik?
Memahami Penilaian Ungkapan:
Biasanya, ungkapan (a== 1 && a ==2 && a==3) akan sentiasa menilai palsu kerana nilai 'a' tidak boleh serentak menjadi 1, 2, dan 3. Walau bagaimanapun, pengendali kesamaan JavaScript (==) mempunyai beberapa keanehan apabila berurusan dengan nilai bukan primitif seperti objek.
Penukaran Nilai Tersuai:
JavaScript membenarkan objek mentakrifkan fungsi toString() atau valueOf() mereka sendiri, yang digunakan untuk menukar objek kepada nilai primitif untuk tujuan perbandingan. Dengan memanfaatkan ini, adalah mungkin untuk mencipta objek yang menukar nilainya setiap kali ia ditukar.
Objek Tersuai dengan Fungsi Dynamic toString():
Pertimbangkan perkara berikut objek:
<code class="js">const a = { i: 1, toString: function () { return a.i++; } }</code>
Objek ini mempunyai sifat 'i' dan fungsi toString() tersuai. Setiap kali objek ditukar kepada nilai primitif (cth., melalui == atau console.log()), fungsi toString() dipanggil, mengembalikan nilai semasa 'i' dan menambahnya.
Helah Penilaian Ungkapan:
Menggunakan objek tersuai ini, ungkapan (a == 1 && a == 2 && a == 3) kini boleh menilai kepada benar:
<code class="js">if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }</code>
Perbandingan pertama (a == 1) mengembalikan benar kerana fungsi toString() mengembalikan 1. Perbandingan kedua (a == 2) juga mengembalikan benar kerana fungsi toString() dipanggil semula, mengembalikan 2. Begitu juga, perbandingan ketiga (a == 3) mengembalikan benar, menyebabkan keseluruhan ungkapan menilai kepada benar.
Kesimpulan:
Walaupun nampaknya berlawanan dengan intuisi, adalah mungkin untuk (a== 1 && a ==2 && a==3) menilai kepada benar dalam JavaScript dengan mencipta objek tersuai yang mengubah nilainya secara dinamik pada penukaran. Ini menunjukkan potensi untuk tingkah laku yang tidak dijangka apabila berurusan dengan nilai bukan primitif dalam JavaScript.
Atas ialah kandungan terperinci Bolehkah Kesamaan Longgar JavaScript (==) Pernah Menjadikan (a == 1 && a == 2 && a == 3) Benar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!