Hãy thử thực hiện các thao tác sau trong JavaScript:
parseInt('01'); //equals 1
parseInt('02'); //equals 2
parseInt('03'); //equals 3
parseInt('04'); //equals 4
parseInt('05'); //equals 5
parseInt('06'); //equals 6
parseInt('07'); //equals 7
parseInt('08'); //equals 0 !!
parseInt('09'); //equals 0 !!
Tôi vừa học được một cách khó khăn khi JavaScript nghĩ số 0 đứng đầu chỉ ra một số nguyên bát phân và vì không có "8"
hoặc "9"
trong cơ sở 8, nên hàm trả về 0. Dù muốn hay không, đây là do thiết kế .
Cách giải quyết là gì?
Lưu ý: Để hoàn thiện, tôi sắp đăng một giải pháp, nhưng đó là một giải pháp mà tôi ghét, vì vậy vui lòng đăng các câu trả lời khác / tốt hơn.
Cập nhật:
Phiên bản thứ 5 của tiêu chuẩn JavaScript ( ECMA-262 ) giới thiệu một thay đổi đột phá giúp loại bỏ hành vi này. Mozilla có một bài viết tốt .
10
(thập phân) trừ khi số để phân tích cú pháp được đặt trước 0x
, ví dụ 0xFF
, trong trường hợp đó, tham số cơ sở mặc định là 16. Hy vọng, một ngày nào đó, vấn đề này sẽ là một ký ức xa xôi.
+'08' === 8
? Thật! Có thể bạn thực sự cần parseInt
cho mã thực sự của bạn, nhưng không phải cho ở trên.
Number('08')
0
hoặc undefined
và số của chuỗi bắt đầu bằng một 0
chữ số không được theo sau bởi x
hoặc X
sau đó, việc triển khai có thể, theo quyết định của nó, diễn giải số đó là số bát phân hoặc là số thập phân. Việc triển khai được khuyến khích diễn giải các số trong trường hợp này là số thập phân. " ( nhấn mạnh của tôi)