2015-05-21 34 views
73

Điều này thật lạ. Đây là những gì xảy ra tại bảng điều khiển JavaScript trong Chrome (phiên bản 42.0.2311.135, 64 bit).Tại sao 00.0 gây ra lỗi cú pháp?

> 0 
< 0 
> 00 
< 0 
> 0.0 
< 0 
> 00.0 
X Uncaught > SyntaxError: Unexpected number 

Firefox 37.0.2 cũng làm như vậy, mặc dù thông báo lỗi của nó là:

SyntaxError: missing ; before statement 

Có lẽ một số giải thích kỹ thuật về cách phân tích cú pháp Javascript số, và có lẽ nó chỉ có thể xảy ra khi mày mò tại giao diện điều khiển nhắc, nhưng nó vẫn có vẻ sai.

Tại sao lại thực hiện điều đó?

+13

Và ở đây tôi nghĩ rằng tôi đã thấy tất cả * WTF * của ngôn ngữ ... Và tôi cách tận hưởng những khoảnh khắc sau đó. –

+2

Đây không phải là một vấn đề chỉ xảy ra trong giao diện điều khiển, 'var i = 00.0;' sẽ luôn luôn ném một SytaxError. – pstenstrm

+3

AFAIK trong JS float literal nên chứa ** decimal ** integer. Các số 0 đầu chỉ ra số nguyên _octal_ ([ref.] (Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Integers)) – hindmost

Trả lời

77

Biểu thức 0.000.0 được phân tích cú pháp khác nhau.

  • 0.0 được phân tách như một số chữ
  • 00.0 được phân tách như:
    • 00 - bát phân số chữ
    • . - accessor
    • 0 tài sản - tên định danh

Mã lỗi của bạn ném lỗi cú pháp vì 0 không phải là số nhận dạng JavaScript hợp lệ. Ví dụ sau đây làm việc kể từ toString là một định danh hợp lệ:

00.toString 

Section 7.8.3 - Leading 0 có thể được theo sau bởi phân cách thập phân hoặc ExponentPart
Section B.1.1 - Leading 0 có thể được theo sau bởi OctalDigits

+18

Lưu ý rằng 00.0 đến 07.0 tăng ngoại lệ, tuy nhiên 08.0 và 09.0 hoàn toàn hợp lệ do cách công cụ không nhận ra chúng dưới dạng bát phân, do đó thay vì bỏ qua các số thập phân này. –

+0

@ChadSchouggins Thật lạ lùng khi các chữ số '8' và '9' đủ để báo cho trình phân tích cú pháp rằng đó là số thập phân thay vì số bát phân, trong khi điểm _decimal_ thì không. Đó là những gì xảy ra quá tải '.' Tôi giả sử. Tôi đã thực hiện phân tích cú pháp khác ... (tôi đủ sáng để thực hiện một trình phân tích cú pháp). –

22

00 được đánh giá là số bát phân và .0 được đánh giá là truy cập thuộc tính của số đó. Nhưng vì các số nguyên không được phép sử dụng như các trình truy cập thuộc tính, nên lỗi được đưa ra.

Bạn nhận được lỗi tương tự cho bất kỳ đối tượng khác:

'string'.0 // Syntax error: unexpected number 
({}).0 // Syntax error: unexpected number 

Bạn có thể tìm thông tin liên quan về accessors tài sản trên MDN.

+7

Trong thông số mới nhất, ký hiệu bát phân bắt đầu bằng '0o'. Tuy nhiên, do khả năng tương thích ngược, cú pháp cũ không có khả năng bị xóa khỏi việc triển khai trình duyệt. – Leo

+0

Tốt nhất. Nếu bạn tìm thấy một số tài liệu về điều đó, vui lòng chỉnh sửa câu trả lời để bao gồm thông tin và liên kết đó - nó có thể hữu ích cho người đọc trong tương lai! –

+0

Bạn có lẽ nên xóa phần không chính xác hoặc, có thể tốt hơn, sửa đổi/viết lại nó đúng ... và viết lại như trái ngược với việc thêm (tức là không có khối "Chỉnh sửa" riêng biệt ở đầu/cuối, nhưng thay vào đó viết lại câu trả lời để tích hợp liền mạch thông tin mới được thêm vào) nói chung là tốt hơn về giá trị lâu dài. – Dukeling

Các vấn đề liên quan