Tôi có một vấn đề khó chịu trong JavaScript .
> parseInt(1 / 0, 19)
> 18
Tại sao parseInt
hàm trả về 18
?
Tôi có một vấn đề khó chịu trong JavaScript .
> parseInt(1 / 0, 19)
> 18
Tại sao parseInt
hàm trả về 18
?
Câu trả lời:
Kết quả 1/0
là Infinity
.
parseInt
coi đối số đầu tiên của nó là một chuỗi có nghĩa là trước hết Infinity.toString()
được gọi, tạo ra chuỗi "Infinity"
. Vì vậy, nó hoạt động tương tự như khi bạn yêu cầu nó chuyển đổi "Infinity"
trong cơ sở 19 sang thập phân.
Dưới đây là các chữ số trong cơ sở 19 cùng với các giá trị thập phân của chúng:
Base 19 Base 10 (decimal)
---------------------------
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a 10
b 11
c 12
d 13
e 14
f 15
g 16
h 17
i 18
Điều xảy ra tiếp theo là parseInt
quét đầu vào "Infinity"
để tìm phần nào có thể được phân tích cú pháp và dừng lại sau khi chấp nhận phần đầu tiên I
(vì n
không phải là chữ số hợp lệ trong cơ sở 19).
Do đó, nó hoạt động như thể bạn đã gọi parseInt("I", 19)
, chuyển thành số thập phân 18 theo bảng trên.
parseInt('Infini',24)
.
n
cũng là một chữ số hợp lệ, nên nó thực sự kết thúc parseInt("Infini", 24)
.
Đây là chuỗi các sự kiện:
1/0
đánh giá Infinity
parseInt
đọc Infinity
và vui vẻ ghi chú đó I
là 18 trong cơ sở 19parseInt
bỏ qua phần còn lại của chuỗi, vì nó không thể được chuyển đổi.Lưu ý rằng bạn sẽ nhận được kết quả cho bất kỳ cơ sở nào >= 19
, nhưng không phải cho các cơ sở dưới đó. Đối với các cơ sở >= 24
, bạn sẽ nhận được một kết quả lớn hơn, khi n
trở thành một chữ số hợp lệ tại thời điểm đó.
parseInt
sẽ chấp nhận là 36, vì có 26 chữ cái trong bảng chữ cái tiếng Anh và quy ước là sử dụng các chữ số sau đó là các chữ cái làm tập hợp các chữ số hợp lệ trong cơ sở đã cho.
Infinity
"Infinity"
Để thêm vào các câu trả lời trên:
parseInt được dự định để phân tích các chuỗi thành số (đầu mối nằm trong tên). Trong tình huống của bạn, bạn không muốn thực hiện bất kỳ phân tích cú pháp nào vì 1/0 đã là một số, vì vậy đây là một lựa chọn chức năng kỳ lạ. Nếu bạn có một số (mà bạn làm) và muốn chuyển đổi nó thành một cơ sở cụ thể, bạn nên sử dụng toString với một cơ số thay thế.
var num = 1 / 0;
var numInBase19 = num.toString(19); // returns the string "Infinity"
Để thêm vào các câu trả lời trên
parseInt(1/0,19)
tương đương với parseInt("Infinity",19)
Trong cơ sở 19 số 0-9
và A-I
(or a-i)
là một số hợp lệ. Vì vậy, từ "Vô cực", nó mất I
cơ sở 19 và chuyển đổi thành cơ sở 10 trở thành 18 Sau đó, nó cố gắng lấy ký tự tiếp theo tức n
là không có trong cơ sở 19 để loại bỏ các ký tự tiếp theo (theo hành vi chuyển đổi chuỗi của javascript thành số )
Vì vậy, nếu bạn viết parseInt("Infinity",19)
HOẶC parseInt("I",19)
HOẶC parseInt("i",19)
kết quả sẽ giống nhau 18
.
Bây giờ, nếu bạn viết parseInt("I0",19)
kết quả sẽ 342
là I X 19 (the base)^1 + 0 X 19^0
= 18 X 19^1 + 0 X 19^0
= 18 X 19 + 0 X 1
= =342
Tương tự, parseInt("I11",19)
sẽ dẫn đến6518
I E
18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 19^2 + 1 X 19^1 + 1 X 19^0
= 18 X 361 + 1 X 19 + 1 X 1
= 6498 + 19 + 1
= 6518
if
có thể giúp đỡ.