2010-09-17 42 views
15

Sau đây sẽ hiển thị trong Firebug hoặc trong jsconsole.com hoặc trong giao diện điều khiển tương tác khác Javascript:Hành vi nhập {a: 1} cho 1 là gì và {a: 1, b: 2} đưa ra lỗi trong bảng điều khiển Javascript?

>>> foo = { a : 1, b : 2.2 } 
Object { a=1, more...} 

>>> foo.a 
1 

>>> foo.b 
2.2 

>>> { a : 1, b : 2.2 } 
SyntaxError: invalid label { message="invalid label", more...} 

>>> { a : 1 } 
1 

tại sao là 1 trở cho {a : 1} và tại sao {a : 1, b : 2.2} đưa ra một lỗi? Trong Ruby, họ sẽ trở lại giống như cách bạn định nghĩa nó.

+1

Đây là một câu hỏi lớn tiếp theo là một câu trả lời tuyệt vời! Rõ ràng là tôi đang nói về câu trả lời của CMS. –

+0

http://stackoverflow.com/questions/1509535/javascript-false-and-false/1509664#1509664 là câu hỏi dường như không liên quan, nhưng với câu trả lời có liên quan đến một điều bạn có thể gặp phải. –

Trả lời

24

Dòng thứ hai cung cấp cho bạn SyntaxError vì mã thông báo { ở đầu nó gây ra sự mơ hồ, trình phân tích cú pháp coi nó như thể là Block statement chứ không phải bắt đầu từ đối tượng.

Ví dụ, một khối tuyên bố hợp lệ:

{ foo: 'bar' } 

Trên đây trông như một đối tượng theo nghĩa đen, nhưng nó không phải là, vì mã được đánh giá trong tuyên bố bối cảnh.

Nó sẽ được phân tích cú pháp dưới dạng Chặn, có chứa labelled statement (foo), theo sau là tuyên bố biểu thức ('bar').

Để đảm bảo rằng bạn đang sử dụng ngữ pháp của một đối tượng theo nghĩa đen, bạn có thể bọc nó với dấu ngoặc đơn (còn gọi là the grouping operator):

({ foo: 'bar' }) 

Nhà điều hành nhóm chỉ có thể đưa Expressions, do đó không có sự mơ hồ .

Xem thêm:

+0

+1 Tôi đã học được điều gì đó mới mẻ hôm nay. Tôi chưa bao giờ đặt cú pháp đối tượng vào một REPL mà không gán nó vào một var, nhưng điều này rất thú vị để biết .. – Matt

+0

(một 'tuyên bố có nhãn' là một cái gì đó được thừa kế từ C, nơi nó có thể được sử dụng cho 'goto Các câu lệnh được gắn nhãn gần như không bao giờ được sử dụng trong JavaScript, đó là lý do tại sao nó ngạc nhiên khi '{foo: 'bar'}' có thể được sử dụng như một câu lệnh hợp lệ.) – bobince

+0

Câu trả lời hoàn toàn tuyệt vời, sẽ upvote hai lần nếu có thể ! –

0

Tôi không phải 100% dương tính, nhưng những gì tôi nghĩ đang xảy ra là trong dòng thứ hai bạn đang xác định một khối, không phải là một đối tượng . Do đó, lỗi phân tích cú pháp xuất hiện khi trình phân tích cú pháp đạt đến dấu phẩy, vì nó phân tích màu bán. Các nhãn bị xóa là các nhãn, như trong lệnh goto hoặc switch. Tôi hy vọng lời giải thích này có ý nghĩa gì.

0

console làm như eval ('bạn nhập')

eval({....}) --- this will get an error 
eval('({....})')---eval string as a function 
Các vấn đề liên quan