JavaScript adalah bahasa pemrograman yang sangat toleran terhadap kesalahan, dan banyak ekspresi yang tidak sah dalam bahasa pemrograman lain akan berfungsi dengan baik di JavaScript.
Ini menghasilkan banyak kode aneh. Apakah Anda ingin menantangnya?
Dalam tantangan ini, Anda akan disuguhkan 20 ekspresi aneh dan diminta menebak keluarannya.
1.
benar + salah
2.
**1.**
3.
[1, 2, 3] + [4, 5, 6]
4.
0,2 + 0,1 === 0,3
5.
10,2
6.
!!""
7.
+!![]
8.
benar == "benar"
9.
010 - 03
10.
"" - - ""
11.
batal + 0
12.
0/0
13.
1/0 === 10 ** 1000
14.
benar++
15.
"" - 1
16.
(null - 1) - "1"
17.
38 * 4343 * 2342+ ("benar" — 0)
18.
5 + !5 + !!5
19.
[] + [1] + 2
20.
1 + 2 + "3"
benar + salah
Saat mencoba menggunakan operator penjumlahan (+) antara dua nilai boolean, keduanya dikonversi menjadi angka.
Dan kita semua tahu true
harus diubah menjadi 1
dan false
harus diubah menjadi 0
. Jadi true+false
mengembalikan 1
.
[,,,].length
[,,,]
menampilkan array dengan tiga slot kosong. Koma terakhir adalah koma tambahan.
Anda bisa memikirkannya seperti ini.
[,] ==> [kosong,] [,,] ==> [kosong, kosong,] [,,,] ==> [kosong, kosong, kosong,]
jadi [,,,].length
mengembalikan 3.
[1, 2, 3] + [4, 5, 6]
Saat Anda mencoba menggunakan operator penjumlahan (+) di antara array, array akan diubah menjadi string.
Saat mengonversi array menjadi string, metode toString()
array dipanggil. Metode toString()
digunakan secara internal oleh JavaScript. Ketika sebuah array perlu ditampilkan sebagai teks, ia akan menghubungkan elemen-elemennya dengan koma.
[1, 2, 3].toString() ==> '1, 2, 3' [4, 5, 6].toString() ==> '4, 5, 6'
jadi
[1, 2, 3] + [4, 5, 6] ==> '1, 2, 3' + '4 , 5, 6' ==> "1,2,34,5,6"
0.2 + 0.1 === 0.3
Karena bilangan floating point sulit direpresentasikan secara akurat di komputer, matematika 0.1
dan 0.2
hanya dapat diperkirakan di komputer digital perwakilan.
Hasil dari 0.1+0.2
tidak persis 0.3
. Bukan hanya JavaScript, bahasa pemrograman lain juga mengalami masalah yang sama.
10, 2
Koma ( ,
) juga merupakan operator sah dalam JavaScript, yang mengevaluasi setiap operan (dari kiri ke kanan) dan mengembalikan nilai operan terakhir.
Oleh karena itu, 10,2 mengembalikan 2
!!""
""
adalah string kosong, yang merupakan nilai dummy.
Catatan: 0, string kosong "", null dan tidak terdefinisi semuanya merupakan nilai virtual.
!
adalah operator logis "tidak", mengubah benar menjadi salah dan sebaliknya.
Jika kita menggunakan !
dua kali, yaitu !!
, itu akan mengubah nilai normal menjadi nilai boolean. Jadi !""
mengembalikan false
.
+!![]
array semuanya adalah nilai sebenarnya, bahkan array kosong. Jadi !![]
akan mengembalikan true
.
!![]; // -> true
dan tanda +
mengubah nilai sebenarnya menjadi representasi numeriknya: 1
, jadi +!![]
mengembalikan 1
.
true == "true"
Operator kesetaraan (==) memeriksa apakah kedua operannya sama dan mengembalikan hasil Boolean.
Menurut aturan perbandingan kesetaraan abstrak, kedua nilai diubah menjadi angka jika dibandingkan.
true == "true" ==> Number(true) == Number("true") ==> 1 == NaN
Jadi, ture =="true"
menghasilkan false.
010 - 03
Ini sedikit triknya: jika suatu angka dimulai dengan 0
, maka itu dianggap sebagai angka oktal dalam JavaScript. Jadi:
010 - 03 ==> 8 - 3 ==> 5
Juga:
""--""
Sepertinya sintaksnya buruk, tetapi berfungsi dengan baik.
String kosong dapat dikonversi ke nilai Boolean false atau nilai numerik 0. Jadi -""
adalah 0
null + 0
Seperti yang kami katakan sebelumnya, null
adalah nilai virtual. Ini akan dikonversi ke nilai boolean false
atau nilai numerik 0
. Jadi hasilnya mengembalikan 0
.
0/0
Ini adalah ekspresi matematika ilegal. Persamaan 0/0 tidak memiliki jawaban numerik yang berarti, keluarannya hanya NaN
.
1/0 === 10 1000**
Meskipun 1/0
adalah ekspresi matematika ilegal seperti sebelumnya. Namun jika pembaginya bukan 0
, JavaScript menganggap hasil ekspresi ini adalah Infinity
.
Dan 10**1000
adalah angka yang besar, dan JS tidak dapat merepresentasikan angka ini dengan benar. (Nilai bilangan bulat tertinggi dalam JavaScript adalah 2^53-1
). Jadi 10 * 1000
juga dianggap tak terhingga.
Tak terhingga selalu sama dengan tak terhingga lainnya, jadi 1/0 === 10 ** 1000
menghasilkan nilai true.
true++
Tidak ada yang istimewa tentang ini, ini hanya kesalahan sintaksis.
""- 1Meskipun
operator penjumlahan (+) berfungsi pada angka dan string, operator pengurangan (-) tidak berguna pada string, jadi JavaScript menafsirkannya sebagai operasi antar angka. String kosong akan dipaksa mengetik ke 0.
"" - 1 ==> Number("") - 1 ==> 0 - 1 ==> -1
jadi "" — 1
mengembalikan -1
(null - 1) - "1"
seperti di atas.
batal ==> 0 (batal - 1) ==> -1 "1" ==> 1
jadi (null — 1) — “1”
mengembalikan -2
38 4343 2342+ ("true" - 0)
Anda mungkin curiga JS sangat gila sehingga mengubah string "true" Apakah numerik representasi nilai Boolean benar. Namun, itu tidak terlalu gila. Apa yang sebenarnya terjadi adalah ia mencoba mengubah string menjadi angka, tetapi gagal.
Number("true"); // -> NaN
Dalam operasi numerik JavaScript, selama satu nilai adalah NaN, hasil akhir dari operasi tersebut harus NaN. 38 * 4343 * 2342
hanyalah tabir asap.
5 + !5 + !!5
seperti yang dinyatakan di atas.
Jadi:
!5 ==> 0 !!5 ==> 1
[] + [1] + 2
Saat mencoba menggunakan operator penjumlahan (+) antar array, array dikonversi menjadi string.
[] ==> '' [1] ==> '1' [] + [1] ==> '1' '1' + 2 ==> '12'
jadi hasilnya '12'.
1 + 2 + "3"
JavaScript melakukan operasi ini dari kiri ke kanan. Ketika angka 3 ditambahkan ke string 3, penggabungan string akan diutamakan.
1 + 2; // -> 3 3 + "3"; // -> "33"
Sejujurnya, tantangan ini tidak memberikan nilai apa pun pada keterampilan pengkodean kita, jadi kode semacam ini tidak boleh ditulis dalam proyek nyata
, namun anggap keterampilan ini sebagai teman Bukankah Bukankah menarik berpura-pura berusia 13 tahun bersama rekan kerja?
Penulis: Marina Mosti
Sumber: medium
Teks asli: https://medium.com/frontend-canteen/20-useless-but-funny-challange-for-javascript-develor-9eea39bb8efb
[Rekomendasi tutorial video terkait: web front-end]
Di atas adalah 20 ekspresi JS yang aneh , tebak hasil keluarannya! Untuk lebih jelasnya silahkan perhatikan artikel terkait lainnya di website php Cina!