('B' + 'a' + + 'a' + 'a') 'nın sonucu neden .LowerCase ()' banana '?


575

Arkadaşlarımdan biri bu JavaScript koduyla karşılaştığında biraz JavaScript uyguluyordum:

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

Yukarıdaki kod cevaplar "banana"! Biri nedenini açıklayabilir mi?


22
Bu ikinci artı tek bir operatördür: +"a"öyle NaN.
Gerardo Furtado

8
Bir konsolda, +'a'kendi başına yazın ve ne olduğunu görün.
Bazı programcı ahbap

23
Ve daha fazlası için istekli olanlar için. Bütün eğlence listesine
Giddy Naya

4
Kesinlikle ilgili: stackoverflow.com/q/9032856
Kyll

Yanıtlar:


566

+'a'için giderir NaNkarakter ederken, bir dizi için bir dize coerces çünkü ( "Not a Number") asayı olarak ayrıştırılamaz.

document.write(+'a');
Küçük harf haline gelir banana.

Ekleme NaNiçin "ba"dönüşler NaNdizeye "NaN"nedeniyle tip dönüşüm verir baNaN. Ve sonra bir aarkada var, veriyor baNaNa.

Arasındaki boşluk + +, ilk dize birleşimini ve ikincisini tek bir artı (yani "pozitif") operatörü yapmaktır. Eğer tür hokkabazlık nedeniyle eşdeğer 'ba'+(+'a')+'a'olarak 'ba'+NaN+'a', kullanırsanız aynı sonucu elde edersiniz 'ba'+'NaN'+'a'.

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


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

... olarak değerlendirilir.

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

(bkz: operatör önceliği )

(+'a')unary artı işlecini'a' kullanarak bir sayıya dönüştürme girişiminde bulunur . Çünkü bir sayı değil, sonucudur ( "Değil-A-Numarası" ):'a'NaN

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

NaN"Sayı Değil" anlamına gelse de , yine de sayısal bir türdür ; dizelere eklendiğinde, diğer herhangi bir sayı gibi birleştirilir:

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

Son olarak, küçük harfle gösterilir:

'baNaNa'.toLowerCase()      =>  'banana'

36
('b' + 'a' + + 'a' + 'a').toLowerCase()

Açıklık için, bunu iki adıma ayıralım. İlk olarak, parantez içindeki ifadenin değerini alırız ve ardından toLowerCase()işlevi sonuca uygularız .

Adım bir

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

LR'ye gidince :

  • 'b' + 'a'ba değerini döndürür , bu düzenli birleştirme işlemidir.
  • ba + + 'a'bitiştirmek için girişimler ba ile + 'a'. Bununla birlikte, tekli operatör +kendi işlenenini bir sayıya dönüştürmeye çalıştığından, NaN değeri döndürülür, bu daha sonra orijinal ba ile birleştirildiğinde bir dizeye dönüştürülür - böylece baNaN ile sonuçlanır .
  • baNaN+ 'a', baNaNa değerini döndürür . Yine, bu düzenli birleştirme.

Bu aşamada, birinci aşamadan elde edilen sonuç baNaNa'dır .

İkinci adım

.toLowerCase()Birinci adımda döndürülen değere uygulamak aşağıdakileri verir:

muz

JavaScript'te kontrol edebileceğiniz birçok benzer kelime var .


24

Sadece + operatörü yüzünden .

Daha fazla bilgi toplayabiliriz.

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

Örneğin

const string =  '10';

Bir dizeyi 2 yolla sayıya dönüştürebilirsiniz:

  1. Numara (dizi);
  2. + Dize;

Böylece orijinal sorguya geri dönelim; Burada bir sonraki karakteri ('a') sayıya dönüştürmeye çalışır ama aniden NaN hatası alırız,

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

Ancak önceki karakter dizgide olduğu için dize gibi davranır. Bu yüzden olacak

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

Ve son olarak onu ToLowerCase () 'e dönüştürür, yani muz olur

Yanına sayı koyarsanız, sonucunuz değişecektir.

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

'Ba1a' olurdu

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


9

Bu kod satırı bir ifadeyi değerlendirir ve sonra döndürülen değere dayalı bir yöntemi çağırır.

İfade ('b' + 'a' + + 'a' + 'a'), yalnızca dizgi değişmezleri ve toplama operatörlerinden oluşur.

  • Dize Değişmezleri "Dize değişmezi, tek veya çift tırnak içine alınmış sıfır veya daha fazla karakterdir."
  • Toplama işleci (+) "Toplama işleci dize birleştirme veya sayısal toplama gerçekleştirir."

Örtük bir eylem, bir dizgideki ToNumber çağrısıdır

  • Dize Türüne Uygulanan ToNumber "Dizelere uygulanan ToNumber , Dize girişine dilbilgisi uygular. Dilbilgisi String'i StringNumericLiteral'ın bir genişletmesi olarak yorumlayamazsa, ToNumber sonucu NaN olur."

Tercüman, ifadeyi sol ve sağ ifadelerin bileşenlerine ayırarak ayrıştırma kurallarına sahiptir.


Aşama 1: 'b' + 'a'

Sol İfade: 'b'
Sol Değer: 'b'

Operatör: + (ifade taraflarından biri bir dizedir, bu nedenle dize birleştirme)

Doğru İfade: 'a' Doğru Değer: 'a'

Sonuç: 'ba'


Adım 2: 'ba' + + 'a'

Sol İfade: 'ba'
Sol Değer: 'ba'

Operatör: + (ifade taraflarından biri bir dizedir, bu nedenle dize birleştirme)

Doğru İfade: + 'a'(bu, 'a' karakterinin Matematik Değerini değerlendirir ve + işaretinden pozitif bir sayı olduğunu varsayar; eksi işareti burada da negatif bir sayıyı gösteren NaN ile sonuçlanacak şekilde çalışırdı)
Doğru Değer: NaN (operatör dize birleştirme olduğundan, birleştirme sırasında bu değer üzerinde toString çağrılır)

Sonuç: 'baNaN'


Aşama 3: 'baNaN' + 'a'

Sol İfade: 'baNaN'
Sol Değer: 'baNaN'

Operatör: + (ifade taraflarından biri bir dizedir, bu nedenle dize birleştirme)

Doğru İfade: 'a'
Doğru Değer: 'a'

Sonuç: 'baNaNa'


Bundan sonra gruplama ifadesi değerlendirildi ve toLowerCase çağrıldı, bu da bizi muzla bıraktı.


7

+ Kullanmak JavaScript'te herhangi bir değeri Number'a dönüştürür!

Yani...

Burada bilmeniz ve öğrenmeniz gereken en önemli şey +, JavaScript'teki herhangi bir değerden önce kullanmaktır , bu değeri bir sayıya dönüştürür , ancak bu değer dönüştürülemezse, JavaScript motoru NaN döndürür , yani bir sayı değil ( bir sayıya dönüştürülecek, dostum!) ve hikayenin geri kalanı aşağıdaki gibi:

('B' + 'a' + + 'a' + 'a') 'nın sonucu neden .LowerCase ()' banana '?



0

Burada sihri görün. İkinci artı, 'NaN' veren tekli bir operatördür.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.