当前位置: 首页 > 面试题库 >

重新使用保留字作为属性名称

伍皓
2023-03-14
问题内容

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

先前的堆栈溢出问题(浏览器支持在JavaScript中使用保留字作为属性名称)间接引发了此问题。答案似乎是AlexWayne的普遍共识:

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

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

虽然我认为他们在这方面可能比我了解更多,并且在某些情况下使用保留字可能不是一个 好主意 ,但基于两点,我认为他们的结论是错误的:

  • 使用保留字作为“速记”属性进行测试

  • HTMLFormElement使得不可能 使用“简写”中的保留字

首先,使用保留字词列表,将每个属性作为属性添加到Objectand HTMLElement,同时作为obj["word"]and
obj.word,然后作为obj["word"]and 检索obj.word。在这63种情况下,所有八项测试均正常工作。

其次,HTMLFormElement必须进行这项工作,因为它使用简写表示法检索其元素。如果<input name='typeof' value='scalar' />是形式元素,则form.typeof==“标量”。

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

在我看来,这些实际问题是:

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

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

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

那么这个结论是正确的吗?只要保留一些常识,保留字作为属性名,并以字符串或速记形式访问它们就好了吗?


问题答案:

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

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

https://developer.mozilla.org/zh-
CN/docs/Web/JavaScript/Reference/Reserved_Words

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



 类似资料:
  • 我需要使用boto3更新我的Dynamodb表中的时间戳属性,但是属性名称“时间戳”是一个保留字,所以它在SET命令上抛出一个错误。 “errorMessage”:“调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:属性名称是保留关键字;保留关键字:时间戳”,

  • 当我尝试这个代码时,我不能给对象中的“option\u code”一个常量。 我想要这样的结果(选项代码需要更改)= 这可能吗?

  • 问题内容: 除了MSSQL和SQLite之外,我还将扩展现有应用程序的数据层以与Firebird 2.5一起使用,但是我遇到了一个绊脚石。 我有一个名为TimeStamp的字段,该字段将数据/时间存储为TimeStamp类型。在类型为datetime的MSSQL和SQLite下,此方法可以正常工作,但在Firebird下适用。以下SQL: 似乎有效,但是TimeStamp字段以字段名称“ CONS

  • 问题内容: 有什么技巧可以将Java保留字用作变量,方法,类,接口,包或枚举常量名称? 问题答案: 不,没有办法。这就是为什么它们被标记为“保留”的原因。

  • 问题内容: 我有以下数据结构 我想将其转换为格式 虽然我确定可以用复杂的方式完成此操作,但是有几行代码可以执行此操作吗? 问题答案: 使用

  • 问题内容: 这是一些简单的代码,但我只是不知道为什么我不能使用这个词作为表的实体 我意识到如果我使用key,我将无法使用“ key”,mysql将要求我检查语法,但是如果我使用“ id”或任何其他表,将会创建该表。 有人知道如何将实体名称创建为密钥吗?这并不重要,因为我只能使用id而不是key,但是由于我发现了此错误,所以我不知道是否有办法使它起作用。 问题答案: 您仍然可以使用。只要用反引号包起