Mengapa hasil dari ('b' + 'a' + + 'a' + 'a'). ToLowerCase () 'pisang'?

575

Saya sedang berlatih JavaScript ketika salah satu teman saya menemukan kode JavaScript ini:

document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());

Kode di atas menjawab "banana"! Adakah yang bisa menjelaskan mengapa?

HV Sharma
sumber
22
Nilai tambah kedua itu adalah operator unary: +"a"is NaN.
Gerardo Furtado
8
Di konsol, tulis +'a'sendiri dan lihat apa yang terjadi.
Beberapa programmer Bung
23
Dan bagi mereka yang ingin lebih. Lihat daftar penuh kesenangan
Giddy Naya
4
Sangat terkait: stackoverflow.com/q/9032856
Kyll

Jawaban:

566

+'a'memutuskan untuk NaN("Bukan Angka") karena itu memaksa string ke angka, sedangkan karakter atidak dapat diuraikan sebagai angka.

document.write(+'a');
Untuk huruf kecil menjadi banana.

Menambahkan NaNke "ba"berubah NaNmenjadi string "NaN"karena konversi tipe, memberi baNaN. Dan kemudian ada di abelakang, memberi baNaNa.

Ruang di antara + +adalah untuk membuat penggabungan string pertama dan yang kedua operator unary plus (yaitu "positif"). Anda memiliki hasil yang sama jika Anda menggunakan 'ba'+(+'a')+'a', diselesaikan sebagai 'ba'+NaN+'a', yang setara dengan 'ba'+'NaN'+'a'karena jenis juggling.

document.write('ba'+(+'a')+'a');

SOFe
sumber
90
'b' + 'a' + + 'a' + 'a'

... dievaluasi sebagai ....

('b') + ('a') + (+'a') + ('a')

(lihat: prioritas operator )

(+'a')mencoba untuk mengkonversi 'a'ke nomor menggunakan operator plus unary . Karena 'a'bukan angka, hasilnya adalah NaN ( "Bukan-A-Nomor" ):

'b'  +  'a'  +  NaN  + 'a'

Meskipun NaNkependekan dari "Not a Number", itu masih tipe numerik ; ketika ditambahkan ke string, ia merangkum sama seperti nomor lainnya:

'b'  +  'a'  +  NaN  + 'a'  =>  'baNaNa'

Akhirnya, huruf kecil:

'baNaNa'.toLowerCase()      =>  'banana'
Tyler Roper
sumber
36
('b' + 'a' + + 'a' + 'a').toLowerCase()

Untuk lebih jelasnya, mari kita bagi menjadi dua langkah. Pertama, kita mendapatkan nilai dari ekspresi yang di dalam tanda kurung dan kemudian kita menerapkan toLowerCase()fungsi pada hasilnya.

Langkah pertama

'b' + 'a' + + 'a' + 'a'

Go LR , kami memiliki:

  • 'b' + 'a'mengembalikan ba , ini adalah rangkaian reguler.
  • ba + + 'a'mencoba untuk menyatukan ba dengan + 'a'. Namun, karena operator unary +mencoba untuk mengubah operan menjadi angka, nilai NaN dikembalikan, yang kemudian dikonversi menjadi string ketika digabungkan dengan ba asli - sehingga menghasilkan baNaN .
  • baNaN+ 'a' mengembalikan baNaNa . Sekali lagi, ini adalah pertemuan rutin.

Pada tahap ini, hasil dari langkah pertama adalah baNaNa .

Langkah dua

Menerapkan .toLowerCase()nilai yang dikembalikan dari langkah pertama memberi:

pisang

Ada banyak permainan kata yang mirip dalam JavaScript yang dapat Anda periksa.

Taslim Oseni
sumber
24

Itu hanya karena + operator.

Kita bisa mendapatkan pengetahuan lebih lanjut dari chunk it.

=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator 
Which later on try to convert next character to the number.

Sebagai contoh

const string =  '10';

Anda dapat mengubah string menjadi angka dengan 2 cara:

  1. Nomor (string);
  2. + string;

Jadi kembali ke permintaan awal; Di sini ia mencoba untuk mengkonversi char berikutnya ('a') ke nomor tetapi tiba-tiba kami mendapat kesalahan NaN,

( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))

Tapi itu memperlakukan sebagai string karena karakter sebelumnya ada di string. Jadi itu akan terjadi

( ('b') + ('a') + 'NaN' + ('a'))

Dan terakhir itu mengubahnya menjadi toLowerCase (), Jadi itu akan menjadi pisang

Jika Anda meletakkan nomor di sebelahnya, hasil Anda akan berubah.

( 'b' + 'a' +  + '1' + 'a' ) 

Itu akan menjadi 'ba1a'

const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana' 
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);

Neel Rathod
sumber
9

Baris kode ini mengevaluasi ekspresi dan kemudian memanggil metode berdasarkan nilai yang dikembalikan.

Ekspresi ('b' + 'a' + + 'a' + 'a')ini hanya terdiri dari string literal dan operator tambahan.

  • String Literals "String literal adalah nol atau lebih karakter yang diapit dengan tanda kutip tunggal atau ganda."
  • Operator Penambahan (+) "Operator tambahan melakukan penggabungan string atau penambahan numerik."

Tindakan implisit yang diambil adalah panggilan untuk ToNumber pada sebuah string

  • ToNumber Diterapkan ke Tipe String "ToNumber diterapkan ke String berlaku tata bahasa ke String input. Jika tata bahasa tidak dapat menafsirkan String sebagai perluasan dari StringNumericLiteral, maka hasil ToNumber adalah NaN."

Penerjemah memiliki aturan tentang bagaimana mem-parsing ekspresi, dengan memecahnya menjadi komponen-komponen ekspresi kiri dan kanan.


Langkah 1: 'b' + 'a'

Ekspresi Kiri: 'b'
Nilai Kiri: 'b'

Operator: + (salah satu sisi ekspresi adalah string, jadi string concatenation)

Ekspresi Benar: 'a' Nilai Benar: 'a'

Hasil: 'ba'


Langkah 2: 'ba' + + 'a'

Ekspresi Kiri: 'ba'
Nilai Kiri: 'ba'

Operator: + (salah satu sisi ekspresi adalah string, jadi string concatenation)

Ekspresi Benar: + 'a'(ini mengevaluasi Nilai Matematika dari karakter 'a' dengan asumsi bahwa itu adalah angka positif dari tanda + - tanda minus juga akan bekerja di sini menunjukkan angka negatif - yang menghasilkan NaN)
Nilai Tepat: NaN (karena operatornya adalah string concatenation, toString dipanggil pada nilai ini selama concatenation)

Hasil: 'baNaN'


Langkah 3: 'baNaN' + 'a'

Ekspresi Kiri: 'baNaN'
Nilai Kiri: 'baNaN'

Operator: + (salah satu sisi ekspresi adalah string, jadi string concatenation)

Ekspresi Benar: 'a'
Nilai Benar: 'a'

Hasil: 'baNaNa'


Setelah ini ekspresi pengelompokan telah dievaluasi, dan toLowerCase disebut yang meninggalkan kita dengan pisang.

Travis J
sumber
7

Menggunakan + akan mengubah nilai apa pun menjadi Angka dalam JavaScript!

Begitu...

Hal utama yang perlu diketahui di sini terlebih dahulu dan pelajari adalah menggunakan +sebelum nilai apa pun dalam JavaScript, akan mengubah nilai itu menjadi angka , tetapi jika nilai itu tidak dapat dikonversi, mesin JavaScript akan mengembalikan NaN , yang berarti, bukan angka (tidak dapat angka dikonversi menjadi angka, sobat!) dan kisah selanjutnya seperti di bawah ini:

Mengapa hasil dari ('b' + 'a' + + 'a' + 'a'). ToLowerCase () 'pisang'?

Alireza
sumber
0

Lihat keajaibannya di sini. Kedua plus adalah operator unary yang memberi 'NaN'

console.log(('b' + 'a' + + 'a' + 'a').toLowerCase());
console.log(('b' + 'a' + + 'a' + 'a'));
console.log(('b' + 'a' + 'a' + 'a').toLowerCase());

Rakibul Islam
sumber