Trong javascript ("11" + 1 = 111) nhưng ("11" - 1 = 10) ?





Thỉnh thoảng trong đầu mình có một số câu hỏi khá ngốc nghếch, câu hỏi trên là một trong số đó.Nhưng đây cũng là một trong những sự điên rồ của javascript.Nếu đã làm việc với javascript thì phải chấp nhận điều đó thôi.Nhưng để đỡ khó chịu thì hôm nay mình xin giải thích điều ngốc nghếch trên theo ý hiểu đơn giản nhất nhé. :))

Đây là cái giá cho việc chuyển kiểu tự động của javascript.

Chúng ta khi có một chuỗi (string) trong trường hợp này là  "11" việc sử dụng mặc định toán tử "+" trong trường hợp này sẽ bị hiểu là nối chuỗi.Điều này thấy khi chúng ta nối 2 chuỗi "Hello" + "world" sử dụng toán tử "+" sẽ được chuỗi "Hello world".

Tuy nhiên chuyện gì xảy ra nếu chúng ta có "Monkey" + 35.Đúng như các bạn tưởng tượng javascript vẫn sử dụng toán tử "+" và ưu tiên phần tử string và nó sẽ cố gắng chuyển phần tử thứ 2 thành chuỗi.Vì vậy trong trường hợp này kết quả sẽ là một chuỗi "Monkey35".Thế còn trường hợp 11 + "1" thì sao?Cũng như quy tắc trên khi sử dụng toán tử "+" nếu một trong hai phần tử là chuỗi (string) thì javascript sẽ cố gắng chuyển phần tử còn lại thành kiểu chuỗi rồi thực hiện nối chuỗi.Kết quả 11 + "1" thì vẫn là  "111".

Vậy câu hỏi là tại sao javascript không check kiểu trước khi sử dụng  "+", nếu là string mà số thì convert về số.Bản chất điều này hoàn toàn có thể nhưng lúc thiết kế javascript đã không chọn con đường này vì nó làm cho việc tính toán sẽ mất thời gian, mà javascript cũng không phải ngôn ngữ có tốc độ quá tốt.

Trong trường hợp toán tử "-" nghe có vẻ giống toán tử  "+" nhưng nhóm thiết kế javascript lại không cho là vậy họ không sử dụng toán từ  "-" trong chuỗi.Vì bạn không thể hiện "-" để kết hợp chuỗi nên javascript sẽ cố gắng chuyển tất cả thành các số để thực hiện toán tử "-".Vì vậy chúng ta có kết quả "11" - 1 = 10;

Happy coding!

Nhận xét

Bài đăng phổ biến từ blog này

Cài đặt SSL cho website sử dụng certbot

Xây dựng một hệ thống comment real-time hoặc chat đơn giản sử dụng Pusher

CÁC BÀI TẬP SQL CƠ BẢN - PART 1

Xây dựng một hệ thống tracking hành vi người dùng (phần 1)

Xây dựng một hệ thống tracking hành vi người dùng (phần 2)

Enterprise architecture trên 1 tờ A4

Web caching (P2)

Bàn về async/await trong vòng lặp javascript

Web caching (P1)

Cài đặt môi trường để code website Rails