【问题标题】:Overwriting Javascript Keywords覆盖 Javascript 关键字
【发布时间】:2012-10-11 13:25:16
【问题描述】:

我知道delete 是 JavaScript 中的关键字。所以我有这个代码(例如):

var user = {
   create : function () {
       // Create a user account
   },

   delete : function () {
       // Delete a user account
   }
};

上述工作(除非是旧版本的 IE),所以我的问题是 - 这是一个好主意。显然,调用user.delete(); 对于使用代码的人来说比user.delete_one(); 更清晰

显然关键字很重要,但根据具体情况是否可以(当然我不需要旧版 IE 支持)使用此方法,还是有更好的解决方案?

【问题讨论】:

  • 您没有覆盖关键字,而是定义了同名的对象属性。 delete 将继续照常工作。
  • 避免保留字。而这个并不是很明显(delete 通常做的事情与你在这里用一个函数可以做的事情非常不同)。
  • @Sirko - 这是我的想法。只要我不重新定义,我过去从未遇到过任何问题。

标签: javascript keyword


【解决方案1】:

你可以这样做:

var user = {
   create : function () {
       // Create a user account
   },

   'delete' : function () {
       // Delete a user account
   }
};

或者使用双引号"

【讨论】:

  • 确实,我认为有些人建议引用所有属性名称。
【解决方案2】:

不要试图覆盖关键字。 IMO 这是一种不好的做法,并且会让其他开发人员感到非常困惑。无需删除功能,您只需将其重命名为 remove

【讨论】:

  • 但是,如果您不重新定义原始关键字,会不会有问题?另外,我想如果我有以下方法:createmodifyetc... 逻辑会将我指向delete 作为逻辑方法。
  • @Fluidbyte 因为您实际上并没有重新定义关键字,所以应该没问题,但是为了获得最佳实践,我会尽量避免这样做。例如,创建、修改删除可以重写为:添加、编辑、删除
【解决方案3】:

您的代码将按预期工作,因为您没有覆盖 JS 关键字。如果尝试将关键字声明为变量或函数名,JS 将显示错误SyntaxError: Unexpected token delete

你选择的方式没关系,但不要直接覆盖JS关键字。

【讨论】:

  • 嗯,你可以重新定义awaitlet
【解决方案4】:

当您使用object literal 时,属性名称可以是以下任何一种:

IdentifierName
StringLiteral
NumericLiteral

StringLiteralNumericLiteral 应该清楚。 IdentifierName 到底是什么?

让我们看看section 7.6 of the specification

标识符名称 ::
标识符开始
标识符名称 *标识符部分*

标识符开始 ::
UnicodeLetter
$
_
\ UnicodeEscapeSequence

标识符部分 ::
标识符开始
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
<ZWNJ>
<ZWJ>

所以,IdentifierName 实际上是如上所述的任何字符序列。是否是保留字无关紧要。

可用于变量和函数名称的名称称为Identifiers,定义为:

标识符 ::
IdentifierName 但不是 ReservedWord

你看,保留字被明确排除为标识符的可能性,而不是对象属性。

但是,您永远不知道解析器有多“好”以及它是否符合所有规则。此外,JSHint 等 linting 工具通常会警告您使用保留关键字,尽管它是有效的。 为了安全起见,您应该将这些词放在引号中,甚至使用括号符号来访问它:

var foo = {'delete': ... }
foo['delete'] = ....;

如果这太麻烦,请不要使用保留字作为属性名称。例如,您可以使用remove,而不是delete

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2019-06-11
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多