33

Có thể sử dụng tên reserved word làm tên thuộc tính của đối tượng không?sử dụng các từ dành riêng làm tên thuộc tính, được xem lại

Sự cố này đã được nêu ra một cách gián tiếp trước đây là stackoverflow question. câu trả lời dường như sự đồng thuận chung bởi @Squeegy:

Bạn có thể sử dụng những từ ngữ, nhưng chỉ như dây đàn và không tính viết tắt - foo["class"] là mát mẻ, trong khi foo.class không phải là
helpfully đưa ra một liên kết đến list of reserved words

trong khi tôi nghĩ rằng @ Squeeky có lẽ là nhiều hiểu biết hơn tôi trong lĩnh vực này và nó có lẽ là một xấu ý tưởng để sử dụng các từ dành riêng trong một số trường hợp, tôi nghĩ rằng kết luận của ông là sai dựa trên hai điểm:

  • thử nghiệm các từ dành riêng sử dụng chúng làm thuộc tính "viết tắt"

  • các HTMLFormElement làm cho nó không thể không để sử dụng các từ dành riêng trong "viết tắt"

Thứ nhất, sử dụng danh sách từ dành riêng, mỗi được thêm vào như là một thuộc tính vào ObjectHTMLElement, cả hai như obj["word"]obj.word và sau đó được truy xuất dưới dạng obj["word"]obj.word. Trong mỗi 63 trường hợp, tất cả tám xét nghiệm đều hoạt động chính xác.

Thứ hai, HTMLFormElement yêu cầu tác phẩm này vì nó truy xuất trong các phần tử của nó bằng ký hiệu viết tắt. Nếu <input name='typeof' value='scalar' /> là phần tử của biểu mẫu, thì form.typeof == "vô hướng".

Từ kinh nghiệm của tôi, các từ dành riêng thường là dữ liệu gây ra (ví dụ: cột có tên "riêng tư"), chứ không phải do chương trình gây ra. Vì vậy, chúng làm ô nhiễm các đối tượng JSON, và từ đó INPUT, và từ đó HTMLFormElement. Nói một cách đơn giản, không cần nhiều công việc (imho không cần thiết), không thể giữ các từ dành riêng không phải bị buộc phải hoạt động chính xác theo cách viết tắt.

Dường như với tôi những vấn đề thực tế:

  • chăm sóc cần được thực hiện để không mâu thuẫn với tồn tại tính, không từ dành riêng

  • (nhiều nếu không phải tất cả) biến không thể đặt trước các từ

  • sử dụng các từ dành riêng làm thuộc tính có thể (nhưng không nhất thiết) gây nhầm lẫn

Kết luận này có chính xác không?

+0

có nghĩa là gì 'form.typeof '? Ý tôi là, nó liên quan đến HTMLFormElement như thế nào? Một thuộc tính của một đối tượng JS có thể được truy cập trong ít nhất hai cách '['prop']' và với ký hiệu dấu chấm '.prop'. Và điều này không liên quan gì đến HTMLFormElement hoặc API DOM hay bất kỳ thứ gì khác. 'form ['typeof']' là hoàn toàn bình thường – user907860

Trả lời

38

Trong ECMAScript, bắt đầu từ ES5, từ dành riêng có thể được sử dụng làm tên thuộc tính đối tượng "trong buff". Điều này có nghĩa là chúng không cần phải được "mặc" trong dấu ngoặc kép khi xác định các ký tự đối tượng và chúng có thể bị bỏ qua (để truy cập, gán và xóa) trên các đối tượng mà không phải sử dụng ký pháp lập chỉ mục khung hình vuông.

Điều đó nói rằng, các từ dành riêng vẫn có thể là NOT được sử dụng làm tên nhận dạng. Điều này được nêu khá rõ ràng trong spec và được phát biểu một cách dứt khoát một chút ở đây (nếu bạn không muốn đôi mắt của bạn chảy máu bằng cách đọc spec ngôn ngữ thực tế) ...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words

Sau đây là các từ khóa và có thể không được sử dụng như các biến, chức năng, phương pháp, hoặc định danh đối tượng, vì ECMAScript xác định hành vi đặc biệt đối với họ:

+0

Sau đó, chúng ta có thể rút ngắn các tập lệnh như bootstrap_multiselect.js sử dụng các cấu trúc như $ tag = $ ('

+0

* các từ dành riêng có thể vẫn KHÔNG được sử dụng làm tên nhận dạng **. Ý của bạn là ** số nhận dạng **? Bởi vì từ những gì tôi đã đọc ở đây và tại trang được liên kết, có vẻ như chúng CÓ THỂ được sử dụng làm tên định danh (IdentifierNames) và không phải là định danh. – user907860

+0

"_ReservedWord_ là tập hợp con được liệt kê của _IdentifierName_. Ngữ pháp cú pháp định nghĩa _Identifier_ là _IdentifierName_ không phải là _ReservedWord_". Rõ ràng như bùn. [nguồn] (http://www.ecma-international.org/ecma-262/7.0/index.html#sec-names-and-keywords) –

6

Tôi không chắc bạn muốn làm gì, vì vậy câu trả lời duy nhất tôi có thể đưa ra là: Có, bạn nên sử dụng các từ dành riêng làm tên thuộc tính.

(Tuy nhiên hai nhận xét nhỏ: foo["class"] là ok, không phải foo[class].Và bất kỳ cách nào bạn nên sử dụng form.elements["xyz"] và không phải form.xyz để truy cập vào phần tử có tên xyz.)

+2

_absolutely_ đồng ý sử dụng 'form.elements ['abc']' thay vì 'form.abc' - nhưng điểm là trình duyệt javascript hỗ trợ' form.abc' theo định nghĩa. sửa lỗi chính tả ở trên. thông qua google và chất lượng, stackoverflow đang trở thành một tài liệu tham khảo được đánh giá cao. khi tôi tham khảo, không có ý nghĩa, vì vậy "cố gắng để thiết lập kỷ lục thẳng" - và nghĩ rằng tôi có thể sai ở đó. –

+0

Việc triển khai non-JSR223 của công cụ JavaScript Rhino của Mozilla thực hiện điều này khi kịch bản lệnh ném một JavaException. Nếu bạn cần làm logic đặc biệt để xử lý nó, bạn cần kiểm tra 'exception.javaException [" class "]. Name' để xem nó có khớp với tên lớp Java của ngoại lệ cụ thể mà bạn đang tìm kiếm hay không. – sworisbreathing

+0

Tại sao bạn nên sử dụng 'foo [" xyz "]' over 'foo.xyz'? Tôi thấy không có lý do gì để ủng hộ cái kia. Người đầu tiên chỉ cần thêm rất nhiều tiếng ồn và chỉ hữu ích là bạn đang sử dụng một từ dành riêng hoặc một biến làm khóa. – cdmckay

3

Vâng, nó có thể được sử dụng.

Chỉ cần nhận xét nhỏ, nếu bạn sử dụng máy nén YUI, bạn phải đặt tên thuộc tính tương đương với một trong các từ dành riêng cho j trong dấu ngoặc kép.

Ví dụ, điều này sẽ không nén

var a = { case : "foo"}; // syntax error, "invalid property id" 
a.for = "bar"; // syntax error, "missing name after . operator" 

này sẽ làm

var a = { "case" : "foo"}; //OK 
a["for"] = "bar"; //OK 

Đây là Online JavaScript/CSS Compression Using YUI Compressor nơi này có thể được kiểm tra.

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