Sự khác biệt giữa các khóa đối tượng với dấu ngoặc kép và không có dấu ngoặc kép là gì?


209

Có sự khác biệt nào giữa

obj = {'foo': 'bar'} 

obj = {foo: 'bar'}

Tôi đã nhận thấy rằng bạn không thể sử dụng -khóa khi tôi không sử dụng dấu ngoặc kép. Nhưng nó thực sự làm cho một sự khác biệt? Nếu có, cái nào?

Câu trả lời:


136

Không, các trích dẫn không tạo ra sự khác biệt (trừ khi, như bạn đã lưu ý, bạn muốn sử dụng một khóa không phải là định danh JavaScript hợp lệ).

Là một lưu ý phụ, định dạng trao đổi dữ liệu JSON không yêu cầu dấu ngoặc kép xung quanh số nhận dạng (và không cho phép dấu ngoặc đơn).


88
Trên thực tế, các trích dẫn có thể tạo ra sự khác biệt nếu bạn sử dụng một chữ số làm tên thuộc tính. Ví dụ, obj = { 12e34: true };không giống như obj = { '12e34': true };. Cái trước sẽ yêu cầu bạn truy cập vào tài sản thông qua obj['1.2e+35'], trong khi đối với cái sau bạn sử dụng obj['12e34']. Xem câu trả lời của tôi để biết thêm chi tiết.
Mathias Bynens

1
Đúng nhưng sẽ rất tuyệt nếu trích dẫn kép là tùy chọn được đưa ra ký tự đầu tiên az + số alpha và có thể khá nhiều người hâm mộ khoảng trắng hay còn gọi là khoảng trắng hoặc tab vô hình? tuyệt vời cho dữ liệu không được lồng sâu.
Jason Sebring

124

Từ tên thuộc tính / khóa đối tượng không được trích dẫn trong JavaScript , bài viết của tôi về chủ đề:

Báo giá chỉ có thể được bỏ qua nếu tên thuộc tính là một chữ số hoặc tên định danh hợp lệ .

[Càng]

Ký hiệu khung có thể được sử dụng một cách an toàn cho tất cả các tên thuộc tính.

[Càng]

Ký hiệu chấm chỉ có thể được sử dụng khi tên thuộc tính là tên định danh hợp lệ.

Lưu ý rằng các từ dành riêng được phép sử dụng làm tên thuộc tính không được trích dẫn trong ES5. Tuy nhiên, để tương thích ngược với ES3, tôi vẫn khuyên bạn nên trích dẫn chúng.

Tôi cũng đã tạo một công cụ sẽ cho bạn biết nếu có bất kỳ tên thuộc tính cụ thể nào có thể được sử dụng mà không có dấu ngoặc kép và / hoặc có ký hiệu dấu chấm. Hãy thử nó tại Mothereff.in/js-properies .

Ảnh chụp màn hình


Công cụ này là một cứu hộ. Cảm ơn đã đăng bài này.
Chris Christensen

Tôi đang trên đường rời khỏi một vách đá, sắp rơi xuống một con dốc rất dốc, lững thững đi về phía cái chết chắc chắn, thảng thốt, đẫm máu; nhưng than ôi, tôi đã nhấp vào một liên kết trong câu trả lời của bạn, trong đó có một công cụ JS rất đơn giản, điều đó ngăn tôi rơi khỏi vách đá đó. Công cụ này là một cứu hộ.
Andrew

8

Không có sự khác biệt ở đây. Chỉ là một vấn đề của phong cách. Một trong những lý do để làm điều này là có thể sử dụng 'siêu' hoặc 'lớp' làm khóa vì đó là những từ khóa dành riêng.

Một số người có thể bị cám dỗ để vượt qua trong một chuỗi có khoảng trắng sau đó gọi o ['Tôi có thể có khoảng trắng'] Nhưng tôi sẽ gọi đó là thực tiễn xấu.


3

Không, không vào javascript. Tuy nhiên, một số trình phân tích cú pháp JSON sẽ thất bại khi không có dấu ngoặc kép quanh các khóa.


35
Các khóa không có dấu ngoặc kép không hợp lệ trong JSON.
Ned Batchelder

1

Có một số tình huống mà chúng khác nhau. Ví dụ: nếu bạn đang sử dụng jQuery và bạn đang tạo một danh sách các tham số cần truyền khi gọi lệnh jQuery $ () để tạo một phần tử, các từ được trích dẫn được chuyển thành tham số và các từ không trích dẫn được chuyển thành hàm. Ví dụ: "size" sẽ đặt thuộc tính kích thước của đối tượng và kích thước (không có dấu ngoặc kép), sẽ gọi hàm size () trên đối tượng. Xem jQuery () , gần cuối trang:

Mặc dù đối số thứ hai là thuận tiện, tính linh hoạt của nó có thể dẫn đến các hậu quả không lường trước được (ví dụ $ (" <input>", {size: "4"}) gọi phương thức .size () thay vì đặt thuộc tính kích thước). Do đó, khối mã trước đó có thể được viết thay vì:


Tôi không nghĩ rằng ví dụ đó nói lên những gì bạn nghĩ. Vấn đề bạn đã trích dẫn là do jQuery có một phương thức gọi là kích thước và mâu thuẫn giữa kích thước phương thức và kích thước thuộc tính được giải quyết bằng cách chọn phương thức. Có các trường hợp trong jQuery khi chuyển Giá trị dưới dạng chuỗi hoặc loại khác gây ra thay đổi hành vi, nhưng không bao giờ xác định thuộc tính có tên thuộc tính hợp lệ trong dấu ngoặc kép so với dấu ngoặc kép.
Alex Weitzer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.