33

是否可以將reserved word用作對象的屬性名稱?使用保留字作爲屬性名稱,重新訪問

此問題在之前的間接提及的stackoverflow question中提出。答案似乎是普遍的共識由@Squeegy:

您可以使用這些詞,但只是作爲字符串,而不是簡寫屬性 - foo["class"]涼爽,而 foo.class
幫忙,給一個鏈接到 list of reserved words

,而我認爲,@ Squeeky可能比我更瞭解在這方面,它可能是一個壞主意在某些情況下使用保留的話,我認爲他的結論是錯誤的基於兩點:保留字

  • 測試使用它們作爲「速記」屬性

  • 的HTMLFormElement使得不可能使用保留字中「的簡寫」

首先,使用保留字列表,每個溶液中加入作爲屬性到ObjectHTMLElement,既作爲obj["word"]obj.word,然後檢索爲obj["word"]obj.word。在63個案例中,所有八個測試都正常工作。

其次,HTMLFormElement使這項工作成爲必要,因爲它使用簡寫符號在其元素中進行檢索。如果<input name='typeof' value='scalar' />是表單的元素,則form.typeof ==「標量」。

根據我的經驗,保留字通常是數據造成的(例如,名爲「private」的列),而不是程序造成的。因此,它們會污染JSON對象,並從那裏輸入,並從那裏HTMLFormElement。簡單地說,沒有大量的(不必要的)工作,不可能保留保留字而不是被迫以正確的速度正常工作。

在我看來,這些現實的問題:

  • 護理需要進行不採取與現有性能發生衝突,而不是保留字

  • (許多,如果不是全部)變量不能保留字

  • 使用保留字作爲屬性可以(但不一定)令人困惑

是這個結論正確,那麼,該保留字作爲屬性名稱,並訪問它們無論是作爲字符串或簡寫,是就好了 - 只要稍有常識的人被應用到的情況呢?

+0

是什麼意思'form.typeof '?我的意思是,它與HTMLFormElement有什麼關係? JS對象的屬性至少可以通過'['prop']'和點記法'.prop'兩種方式來訪問。這與HTMLFormElement或DOM API或其他任何內容無關。 'form ['typeof']'絕對正常 – user907860

回答

38

在ECMAScript中,從ES5開始,保留字可用作「buff」中的對象屬性名稱。這意味着在定義對象文字時,它們不需要在引號中「穿衣」,並且它們可以在不需要使用方括號索引符號的情況下取消引用(用於訪問,分配和刪除)對象。

也就是說,保留字仍然可以使用而不是作爲標識符名稱。這是在規範非常明確地表示,並在一定程度上說明這裏着重(如果你不想讓你的眼睛具有讀取實際語言規範流血)...

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

以下是關鍵字,不得用作變量, 函數,方法或對象標識符,因爲ECMAScript中 指定特殊的行爲對他們來說:

+0

那麼,我們可以如何縮小像bootstrap_multiselect.js這樣的腳本,它們使用的結構像 $ tag = $('

+0

*保留字可能仍不能用作**標識符名稱***。你的意思是**標識符**?因爲從我在這裏閱讀的內容和鏈接的頁面看來,它們看起來可能被用作標識符名稱(IdentifierNames)而不是標識符。 – user907860

+0

「_ReservedWord_是_IdentifierName_的枚舉子集。句法語法將_Identifier_定義爲_IdentifierName_不是_ReservedWord_」。清除泥漿。 [源(http://www.ecma-international.org/ecma-262/7.0/index.html#sec-names-and-keywords) –

6

我不太清楚你想做什麼,所以我可以給出的唯一答案是:是的,可以使用保留字作爲屬性名稱。

(但是兩個小小的評論:foo["class"]是好的,而不是foo[class]。並且您應該使用form.elements["xyz"]而不是form.xyz來訪問名爲xyz的元素。)

+2

_絕對同意使用'form.elements ['abc']'而不是'form.abc' - 但問題在於javascript瀏覽器根據定義支持'form.abc'。固定錯字以上。通過谷歌和質量,stackoverflow正在成爲一個高度重視的參考。當我參考時,沒有道理,所以「試圖設置記錄」 - 並認爲我可能是錯的。 –

+0

當腳本拋出JavaException時,Mozilla Rhino JavaScript引擎的非JSR223實現會執行此操作。如果你需要做特殊的邏輯來處理它,你需要檢查'exception.javaException [「class」] .name'來查看它是否與你正在尋找的特定異常的Java類名相匹配。 – sworisbreathing

+0

爲什麼要在'foo.xyz'上使用'foo [「xyz」]'?我認爲沒有理由相互贊成。第一個只是增加了很多噪音,只有在使用保留字或變量作爲關鍵字時纔有用。 – cdmckay

3

是的,它可以使用。

只需稍加說明,如果您使用YUI壓縮機,則必須將屬性名稱等於引號中的js保留字之一。

例如,這會不會壓縮

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

這將做

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

這裏是Online JavaScript/CSS Compression Using YUI Compressor這個地方可以測試。

相關問題