Tại sao kết quả của ('b' + 'a' + + 'a' + 'a'). ToLowerCase () 'chuối'?


575

Tôi đang thực hành một số JavaScript khi một trong những người bạn của tôi bắt gặp mã JavaScript này:

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

Các câu trả lời mã trên "banana"! Bất cứ ai có thể giải thích tại sao?


22
Điểm cộng thứ hai đó là một toán tử đơn nguyên: +"a"NaN.
Gerardo Furtado

8
Trong một giao diện điều khiển, viết một +'a'mình và xem những gì sẽ xảy ra.
Một số lập trình viên anh chàng

23
Và cho những người háo hức để biết thêm. Xem danh sách đầy đủ niềm vui
Giddy Naya

4
Liên quan chặt chẽ: stackoverflow.com/q/9032856
Kyll

Câu trả lời:


566

+'a'giải quyết thành NaN("Không phải là số") vì nó ép một chuỗi thành một số, trong khi ký tự acó thể được phân tích thành một số.

document.write(+'a');
Để viết thường nó trở thành banana.

Thêm NaNvào "ba"biến NaNthành chuỗi "NaN"do chuyển đổi loại, cho baNaN. Và sau đó là một ađằng sau, cho đi baNaNa.

Khoảng trống giữa + +là để thực hiện phép nối một chuỗi đầu tiên và chuỗi thứ hai là toán tử cộng đơn (tức là "dương"). Bạn có kết quả tương tự nếu bạn sử dụng 'ba'+(+'a')+'a', giải quyết như 'ba'+NaN+'a', tương đương với 'ba'+'NaN'+'a'do tung hứng kiểu.

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


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

... được đánh giá là ....

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

(xem: ưu tiên nhà điều hành )

(+'a')cố gắng chuyển đổi 'a'thành một số bằng cách sử dụng toán tử cộng đơn . Bởi vì 'a'không phải là số, kết quả là NaN ( "Không phải là số" ):

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

Mặc dù NaNlà viết tắt của "Không phải là số", nó vẫn là một loại số ; khi được thêm vào chuỗi, nó sẽ nối giống như bất kỳ số nào khác:

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

Cuối cùng, nó hạ thấp:

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

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

Để rõ ràng, hãy chia nó thành hai bước. Đầu tiên, chúng ta nhận được giá trị của biểu thức được ngoặc đơn và sau đó chúng ta áp dụng toLowerCase()hàm trên kết quả.

Bước một

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

Đi LR , chúng tôi có:

  • 'b' + 'a'Trả về ba , đây là nối thường xuyên.
  • ba + + 'a'cố gắng nối ba với + 'a'. Tuy nhiên, do toán tử đơn nguyên +cố gắng chuyển đổi toán hạng của nó thành một số, giá trị NaN được trả về, sau đó được chuyển đổi thành một chuỗi khi nối với ba gốc - do đó dẫn đến baNaN .
  • baNaN+ 'a' trả về baNaNa . Một lần nữa, đây là sự kết hợp thường xuyên.

Ở giai đoạn này, kết quả từ bước một là baNaNa .

Bước hai

Áp dụng .toLowerCase()giá trị trả về từ bước một cho:

trái chuối

Có rất nhiều cách chơi chữ tương tự trong JavaScript mà bạn có thể kiểm tra.


24

Đó chỉ là do toán tử + .

Chúng ta có thể có thêm kiến ​​thức từ chunk nó.

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

Ví dụ

const string =  '10';

Bạn có thể chuyển đổi một chuỗi thành số theo 2 cách:

  1. Số (chuỗi);
  2. + chuỗi;

Vì vậy, trở lại truy vấn ban đầu; Ở đây, nó cố gắng chuyển đổi char tiếp theo ('a') thành số nhưng đột nhiên chúng tôi gặp lỗi NaN,

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

Nhưng nó xử lý như một chuỗi vì ký tự trước đó nằm trong chuỗi. Vì vậy nó sẽ được

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

Và cuối cùng nó chuyển đổi nó thànhLowerCase (), vì vậy nó sẽ là chuối

Nếu bạn được đặt số bên cạnh nó, kết quả của bạn sẽ thay đổi.

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

Nó sẽ là 'ba1a'

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


9

Dòng mã này đánh giá một biểu thức và sau đó gọi một phương thức dựa trên giá trị được trả về.

Biểu thức ('b' + 'a' + + 'a' + 'a')chỉ bao gồm các chuỗi ký tự và toán tử cộng.

  • Chuỗi ký tự "Một chuỗi ký tự là 0 hoặc nhiều ký tự được đặt trong dấu ngoặc đơn hoặc dấu ngoặc kép."
  • Toán tử bổ sung (+) "Toán tử bổ sung thực hiện nối chuỗi hoặc cộng số."

Một hành động ngầm được thực hiện là gọi ToNumber trên chuỗi

  • ToNumber được áp dụng cho Loại chuỗi "ToNumber được áp dụng cho Chuỗi áp dụng ngữ pháp cho Chuỗi đầu vào. Nếu ngữ pháp không thể hiểu Chuỗi là một bản mở rộng của StringNumericLiteral, thì kết quả của ToNumber là NaN."

Trình thông dịch có các quy tắc về cách phân tích biểu thức, bằng cách chia nó thành các thành phần của biểu thức tay trái và tay phải.


Bước 1: 'b' + 'a'

Biểu thức bên trái: 'b'
Giá trị bên trái: 'b'

Toán tử: + (một trong các mặt của biểu thức là một chuỗi, do đó, nối chuỗi)

Biểu thức đúng: 'a' Giá trị đúng: 'a'

Kết quả: 'ba'


Bước 2: 'ba' + + 'a'

Biểu thức bên trái: 'ba'
Giá trị bên trái: 'ba'

Toán tử: + (một trong các mặt của biểu thức là một chuỗi, do đó, nối chuỗi)

Biểu thức đúng: + 'a'(điều này đánh giá Giá trị toán học của ký tự 'a' giả sử rằng đó là số dương từ dấu + - dấu trừ cũng sẽ hoạt động ở đây chỉ ra số âm - kết quả là NaN)
Giá trị đúng: NaN (vì toán tử là nối chuỗi, toString được gọi trên giá trị này trong quá trình nối)

Kết quả: 'baNaN'


Bước 3: 'baNaN' + 'a'

Biểu thức bên trái: 'baNaN'
Giá trị bên trái: 'baNaN'

Toán tử: + (một trong các mặt của biểu thức là một chuỗi, do đó, nối chuỗi)

Biểu thức đúng: 'a'
Giá trị đúng: 'a'

Kết quả: 'baNaNa'


Sau đó, biểu thức nhóm đã được đánh giá và toLowerCase được gọi là lá chuối cho chúng ta.


7

Sử dụng + sẽ chuyển đổi bất kỳ giá trị nào thành Số trong JavaScript!

Vì thế...

Điều chính ở đây cần biết trước và học từ việc sử dụng +trước bất kỳ giá trị nào trong JavaScript, sẽ chuyển đổi giá trị đó thành một số , nhưng nếu giá trị đó không thể được chuyển đổi, công cụ JavaScript sẽ trả về NaN , có nghĩa là, không phải là số ( không thể là số được chuyển đổi thành một số, bạn đời!) và phần còn lại của câu chuyện như sau:

Tại sao kết quả của ('b' + 'a' + + 'a' + 'a'). ToLowerCase () 'chuối'?



0

Xem điều kỳ diệu ở đây. Điểm cộng thứ hai là một toán tử đơn nguyên cho 'NaN'

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.