Ada pertanyaan seperti itu dalam kumpulan pertanyaan tes yang disusun oleh cssrain:
<BAHASA SKRIP="JavaScript">
var a = 0;
var b = -1;
var c = 1;
fungsi menegaskan (aVar) {
if (aVar==true) peringatan(benar);
lain peringatan(salah);
}
menegaskan(a);
menegaskan(b);
menegaskan(c);
</SKRIP>
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Menurut pemahaman saya, nilai boolean apa pun yang bukan 0 harusnya benar.
Namun keluaran yang benar dari pertanyaan ini adalah: false false true.
Nilai (-1==true) salah.
Mari kita lihat contoh berikut:
<BAHASA SKRIP="JavaScript">
var a = 0;
var b = -1;
var c = 1;
fungsi menegaskan (aVar) {
if (aVar) peringatan (benar);
lain peringatan(salah);
}
menegaskan(a);
menegaskan(b);
menegaskan(c);
</SKRIP>
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Hasil yang berjalan adalah: salah, benar, benar.
Di sini, kami menemukan bahwa hasil if(aVar) dan if(aVar == true) tidak sama.
Penjelasan cssrain pada jawabannya adalah:
if(aVar) dan if (aVar==true) memiliki jawaban yang sangat berbeda untuk bilangan negatif.
Apakah ini benar-benar alasan angka negatifnya? Perhatikan contoh berikut:
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Mengapa angka positif 2 juga menghasilkan nilai salah? Mari kita ubah angkanya menjadi nilai boolean dan lihat.
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Nilai Boolean bukan nol di sini memang benar, artinya semua soal fokus pada operator == di 2==true. Pada dasarnya dipastikan bahwa == tidak boleh mengubah angka menjadi nilai Boolean dan kemudian membandingkannya.
Lihat apa yang dikatakan ECMA-262 (halaman 80):
6.Jika Type(x) adalah Boolean, kembalikan hasil perbandingan ToNumber(x) == y.
7.Jika Type(y) adalah Boolean, kembalikan hasil perbandingan x == ToNumber(y).
Artinya, nilai Boolean terlebih dahulu diubah menjadi angka lalu dibandingkan. Nilai numerik benar adalah 1 dan salah adalah 0. Jadi, baik 2 maupun -1 tidak bisa sama dengan benar.
Perhatikan lebih dekat contoh berikut:
<BAHASA SKRIP="JavaScript">
var a = "tidak terdefinisi";
var b = "salah";
var c = "";
fungsi menegaskan (aVar) {
if (aVar==true) peringatan(benar);
lain peringatan(salah);
}
menegaskan(a);
menegaskan(b);
menegaskan(c);
</SKRIP>
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Berdasarkan gagasan sebelumnya, nilai benar akan diubah menjadi 1, sehingga ketiga pernyataan akan menghasilkan nilai salah. Jalankan dan temukan bahwa memang demikianlah masalahnya.
Selanjutnya, ubah if(aVar==true) menjadi if(aVar).
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Hasil yang berjalan saat ini adalah benar, benar, salah. Karena hasil Boolean("tidak terdefinisi"), Boolean("false"), dan Boolean("") adalah benar, benar, dan salah. String yang tidak kosong diubah menjadi Boolean true.
Terakhir, ada contoh untuk menjelaskan aturan perbandingan ketika kedua sisi == adalah string dan angka.
Jalankan kotak kode
[Ctrl+A Pilih Semua Tip: Anda dapat memodifikasi sebagian kode terlebih dahulu lalu tekan Jalankan]
Apakah Anda menemukan bahwa "001"==true ini benar.
Karena true diubah menjadi 1 terlebih dahulu. Kemudian lihat aturan ECMA:
4.Jika Type(x) adalah Number dan Type(y) adalah String, kembalikan hasil perbandingan x == ToNumber(y).
5.Jika Type(x) adalah String dan Type(y) adalah Number, kembalikan hasil perbandingan ToNumber(x) == y.
String tersebut akan diubah menjadi angka, dan nilai Number("001") juga 1, sehingga hasilnya benar.