Giả sử tôi viết 0.5
theo 0.-5
cách không mong muốn, nhưng nó vẫn có thể chạy. Cái gì0.
tại 0.-5
làm như vậy mà nó vẫn có thể chạy và đánh giá lại đến -5?
Tôi cũng đã cố gắng alert(0.-5+1)
mà in -4, không bỏ qua JavaScript 0.
trong 0.-5
?
Giả sử tôi viết 0.5
theo 0.-5
cách không mong muốn, nhưng nó vẫn có thể chạy. Cái gì0.
tại 0.-5
làm như vậy mà nó vẫn có thể chạy và đánh giá lại đến -5?
Tôi cũng đã cố gắng alert(0.-5+1)
mà in -4, không bỏ qua JavaScript 0.
trong 0.-5
?
0.-5
là một "cách bất ngờ"?
0.-5
lỗi cú pháp và không cho phép ký tự float với dấu .0
chấm nhưng buộc mọi người phải viết ở cuối.
.
ngăn bạn viết một cái gì đó giống như 123.toString(16)
(A lừa phổ biến là sử dụng 123..toString(16)
, đó là thực sự (123.).toString(16)
)
Câu trả lời:
Các chữ số ở cuối sau a .
là tùy chọn:
console.log(0. === 0); // true
Vì thế
0.-5
đánh giá
0 - 5
mà chỉ là -5
. Tương tự,
0.-5+1
Là
0 - 5 + 1
đó là
-5 + 1
hoặc -4
.
0.-5
có thể được phân tích thành công như 0.
[1] , -
và 5
. Dưới đây là cây cú pháp trừu tượng cho biểu thức được tạo bởi AST explorer:
Đây (theo cách không mong muốn) là JavaScript hợp lệ và được đánh giá là -5
.
[1] Theo ngữ pháp cho các chữ số, các chữ số thập phân và phần lũy thừa là tùy chọn:
NumericLiteral ::
DecimalLiteral
[...]DecimalLiteral ::
DecimalIntegerLiteral. DecimalDigits opt ExponentPart opt
Trong JS, bạn có thể biểu thị một số với dấu thập phân tùy chọn.
x = 5.; //5
x = 5. + 6. //11
Và theo nhận xét của Tvde1, bất kỳ phương pháp Số nào cũng có thể được áp dụng.
5..toString()
Cú pháp này cho phép chúng ta chạy các hàm Số không có dấu ngoặc đơn.
5.toString() //error
(5).toString() //good
5..toString() //good
5 .toString() // awesome
Xem câu hỏi này để tìm hiểu tại sao.
5..toString()
.
1.0
là dấu phẩy động nhưng 1.
là một số nguyên.
float
s có các phương thức, và 5.
là một float
.
(1).toMethod()
được pháp luật cấm (1.)
phân tích cú pháp đúng cách. Cách tiếp cận truyền thống nhất để phân tích cú pháp (ghép nối tham lam các mã thông báo, bao gồm cả các ký tự, sau đó phân tích cú pháp) tạo ra hành vi Javascript.
Tôi sẽ nghĩ rằng câu trả lời thực sự không phải về dấu thập phân, mà là về dấu trừ: điều đó sẽ không được hiểu như một toán tử nếu nó được đặt trước bất kỳ thứ gì giống như một số?
console.log(0. - 5) // -5
console.log(0 - 5) // -5
console.log('0.' - 5) // -5
console.log('0' - 5) // -5
console.log(0.-5 === -5) // true
'0.' hoặc '0' giống nhau trong JavaScript vì kiểu là duy nhất cho các số, được gọi là Số. Toán tử trừ nằm giữa Số, luôn cố gắng chuyển những gì bạn chuyển thành Số. Trong Python thì khác, đầu tiên là Float và thứ hai là Integer vì nó có một số kiểu.
0.
giống như0.0
. Hoặc chỉ0
.