Ignacio Vazquez-Abrams là chính xác, nhưng hãy xem chính xác cách thức hoạt động của nó ...
Từ 15.1.2.2 parseInt (string , radix)
:
Khi hàm parseInt được gọi, các bước sau được thực hiện:
- Đặt inputString là ToString (chuỗi).
- Đặt S là một chuỗi con mới được tạo của inputString bao gồm ký tự đầu tiên không phải là StrWhiteSpaceChar và tất cả các ký tự theo sau ký tự đó. (Nói cách khác, loại bỏ khoảng trắng hàng đầu.)
- Đặt ký hiệu là 1.
- Nếu S không trống và ký tự đầu tiên của S là dấu trừ -, hãy đặt dấu là −1.
- Nếu S không trống và ký tự đầu tiên của S là dấu cộng + hoặc dấu trừ - thì xóa ký tự đầu tiên khỏi S.
- Đặt R = ToInt32 (cơ số).
- Hãy để dải phân cách là đúng.
- Nếu R 0, thì a. Nếu R <2 hoặc R> 36, thì trả về NaN. b. Nếu R ≠ 16, hãy để dảiPrefix là sai.
- Khác, R = 0 a. Đặt R = 10.
- Nếu dảiPrefix là đúng, thì a. Nếu độ dài của S ít nhất là 2 và hai ký tự đầu tiên của S là hoặc 0x, hoặc 0 0, thì xóa hai ký tự đầu tiên khỏi S và để R = 16.
- Nếu S chứa bất kỳ ký tự nào không phải là chữ số radix-R, thì hãy để Z là chuỗi con của S bao gồm tất cả các ký tự trước ký tự đầu tiên như vậy; mặt khác, đặt Z là S.
- Nếu Z trống, trả về NaN.
- Đặt mathInt là giá trị nguyên toán học được biểu thị bằng Z theo ký hiệu radix-R, sử dụng các chữ cái AZ và az cho các chữ số có giá trị 10 đến 35. (Tuy nhiên, nếu R là 10 và Z chứa hơn 20 chữ số có nghĩa chữ số sau số 20 có thể được thay thế bằng 0 chữ số, tùy chọn triển khai và nếu R không phải là 2, 4, 8, 10, 16 hoặc 32, thì mathInt có thể là xấp xỉ phụ thuộc vào thực hiện với số nguyên toán học giá trị được biểu thị bằng Z trong ký hiệu radix-R.)
- Đặt số là giá trị Số cho mathInt.
- Dấu trả về × số.
LƯU Ý parseInt chỉ có thể hiểu một phần đầu của chuỗi là một giá trị nguyên; nó bỏ qua bất kỳ ký tự nào không thể được hiểu là một phần của ký hiệu số nguyên và không có dấu hiệu nào cho thấy bất kỳ ký tự nào như vậy bị bỏ qua.
Có hai phần quan trọng ở đây. Tôi in đậm cả hai. Vì vậy, trước hết, chúng ta phải tìm ra những gì toString
đại diện null
là. Chúng ta cần xem Table 13 — ToString Conversions
trong phần 9.8.0 để biết thông tin đó:
Tuyệt vời, vì vậy bây giờ chúng tôi biết rằng làm toString(null)
nội bộ mang lại một 'null'
chuỗi. Tuyệt vời, nhưng chính xác thì nó xử lý các chữ số (ký tự) không hợp lệ trong cơ số được cung cấp như thế nào?
Chúng tôi nhìn ở trên 15.1.2.2
và chúng tôi thấy nhận xét sau:
Nếu S chứa bất kỳ ký tự nào không phải là chữ số radix-R, thì hãy để Z là chuỗi con của S bao gồm tất cả các ký tự trước ký tự đầu tiên như vậy; mặt khác, đặt Z là S.
Điều đó có nghĩa là chúng tôi xử lý tất cả các chữ số TRƯỚC cho cơ số được chỉ định và bỏ qua mọi thứ khác.
Về cơ bản, làm parseInt(null, 23)
là điều tương tự như parseInt('null', 23)
. Các u
nguyên nhân hai l
là để được bỏ qua (mặc dù họ là một phần của cơ số 23). Do đó, chúng tôi chỉ có thể phân tích cú pháp n
, làm cho toàn bộ tuyên bố đồng nghĩa với parseInt('n', 23)
. :)
Dù bằng cách nào, câu hỏi tuyệt vời!