51

保留字可以用作对象的属性名称吗?

这个问题是在之前的 Stack Overflow 问题中间接提出的:Browser support for using a reserved word as a property name in JavaScript。答案似乎是Alex Wayne的普遍共识:

您可以使用这些词,但只能作为字符串而不是速记属性。

foo['class']; // cool
foo.class;    // not cool

虽然我认为他们在这方面可能比我知识渊博,并且在某些情况下使用保留字可能是一个坏主意,但我认为他们的结论基于两点是错误的:

  • 使用它们作为“速记”属性来测试保留字

  • HTMLFormElement 使得不可能在“速记”中使用保留字

首先,使用保留字列表,将每个作为属性添加到ObjectandHTMLElement中,同时作为obj["word"]and obj.word,然后作为obj["word"]and检索obj.word。在 63 个案例中,所有 8 个测试都正常工作。

其次,HTMLFormElement 使这项工作成为必要,因为它使用速记符号在其元素中检索。如果<input name='typeof' value='scalar' />是表单的元素,则form.typeof== “标量”。

根据我的经验,保留字通常是数据造成的(例如名为“private”的列),而不是程序造成的。因此,它们会污染 JSON 对象,并从那里污染输入,然后再从那里污染 HTMLFormElement。简而言之,如果没有大量(恕我直言,不必要的)工作,就不可能保持保留字被强制以简写方式正确工作。

在我看来,这些真正的问题:

  • 需要注意不要与现有属性冲突,而不是保留字。

  • (很多如果不是全部)变量不能是保留字

  • 使用保留字作为属性可能(但不一定)令人困惑

那么这个结论是否正确,将保留字作为属性名称,并以字符串或速记的形式访问它们就可以了——只要对这种情况应用一点常识?

4

4 回答 4

55

在 ECMAScript 中,从 ES5 开始,保留字可以用作“在 buff”中的对象属性名称。这意味着在定义对象字面量时不需要将它们“包裹”在引号中,并且可以在对象上取消引用(用于访问、分配和删除),而无需使用方括号索引表示法。

也就是说,保留字可能仍然不能用作标识符名称。这在规范中非常明确地说明,并且在这里有些强调(如果您不希望您的眼睛因不得不阅读实际的语言规范而流血)......

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

以下是关键字,不能用作变量、函数、方法或对象标识符,因为 ECMAScript 为它们指定了特殊行为:

于 2013-07-28T19:08:45.390 回答
8

我不太确定您要表达什么意思,所以我能给出的唯一答案是:是的,可以使用保留字作为属性名称。

(但是有两个小评论:foo["class"]可以,不是foo[class]。以及您应该使用的任何方式 form.elements["xyz"]而不是form.xyz访问名为 的元素xyz。)

于 2011-08-11T08:49:08.473 回答
8

是的,它可以使用。

仅此一点,如果您使用 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

这是使用 YUI Compressor 进行在线 JavaScript/CSS 压缩,可以在其中进行测试。

于 2013-08-30T12:46:07.720 回答
3

是的,在大多数浏览器中(包括 IE9+)

Kangax 兼容性表中实际上有一个条目“保留字作为属性名称”

http://kangax.github.io/compat-table/es5/#test-Object/array_literal_extensions_Reserved_words_as_property_names

于 2017-01-20T23:12:07.363 回答