【问题标题】:Alphanumeric object attribute name字母数字对象属性名称
【发布时间】:2019-08-13 10:48:23
【问题描述】:

我已经声明了一个简单的 JavaScript 对象,它是表格的模型模型。

代码运行良好,我可以访问我需要的所有数据。

由于某种原因,如果我在用数字后跟字母编写突出显示的属性(在下一段代码中)时得到Uncaught SyntaxError: Invalid or unexpected token

var parameters_table = {
    M:{D:3.944,T:1.1606,M:5.3893},
    7:{D:5.1847,T:2.059,M:2.8712},
    aug:{D:4.99,T:6.173,M:1.495},
    6:{D:4.962,T:1.2287,M:0.94456},
    aug7:{D:6.14,T:4.16,M:0.632},
    m7b5:{D:6.12226,T:2.6665,M:0.29159},
    7sus4:{D:4.7313,T:2.7964,M:0.2592}//Here there's the error with the name
};

如果我写类似:

var parameters_table = {
    M:{D:3.944,T:1.1606,M:5.3893},
    7:{D:5.1847,T:2.059,M:2.8712},
    aug:{D:4.99,T:6.173,M:1.495},
    6:{D:4.962,T:1.2287,M:0.94456},
    aug7:{D:6.14,T:4.16,M:0.632},
    m7b5:{D:6.12226,T:2.6665,M:0.29159},
    sus4:{D:4.7313,T:2.7964,M:0.2592}//This works
};

只需删除7,它就可以正常工作。

为什么会出现这个错误?我认为这可能是字母数字名称的问题,但我已经在其他字段中使用了混合字符(数字+字母)而没有任何问题。

【问题讨论】:

标签: javascript object attributes


【解决方案1】:

JavaScript 属性和变量名不能以数字开头。但是,您可以使用涉及字符串访问的轻微技巧:

"7sus4": {...}

然后像这样访问它:

parameters_table["7sus4"]

【讨论】:

    【解决方案2】:

    如果你在属性周围加上引号,代码就可以正常工作:

    var parameters_table = {
        M:{D:3.944,T:1.1606,M:5.3893},
        7:{D:5.1847,T:2.059,M:2.8712},
        aug:{D:4.99,T:6.173,M:1.495},
        6:{D:4.962,T:1.2287,M:0.94456},
        aug7:{D:6.14,T:4.16,M:0.632},
        m7b5:{D:6.12226,T:2.6665,M:0.29159},
        "7sus4":{D:4.7313,T:2.7964,M:0.2592}//Here there's the error with the name
    };
    

    【讨论】:

      【解决方案3】:

      在 Javascript 中,如果您想在属性中先使用字母,则需要将键用双引号 "" 括起来作为示例 使用以下它会正常工作

      var parameters_table = {
      M:{D:3.944,T:1.1606,M:5.3893},
      7:{D:5.1847,T:2.059,M:2.8712},
      aug:{D:4.99,T:6.173,M:1.495},
      6:{D:4.962,T:1.2287,M:0.94456},
      aug7:{D:6.14,T:4.16,M:0.632},
      m7b5:{D:6.12226,T:2.6665,M:0.29159},
      "7sus4":{D:4.7313,T:2.7964,M:0.2592}};
      

      类似地,当属性名中有'-'时我们需要使用""

      【讨论】:

        【解决方案4】:

        出了什么问题

        变量的名称(称为标识符)符合某些规则,您的代码必须遵守这些规则!

        JavaScript 标识符必须以字母、下划线 (_) 或美元符号 ($) 开头。他们不能以数字开头!只有后续字符可以是数字 (0-9)。

        给出以下错误:

        SyntaxError: 标识符在数字文字之后立即开始

        更多详情请点击以下链接:

        developer.mozilla.org syntax errors

        【讨论】:

          【解决方案5】:

          Javascript 标识符不能以数字开头:

          11.6.1 标识符名称

          11.6.1.1 静态语义:早期错误

          IdentifierStart :: \UnicodeEscapeSequence

          • 如果 SV(UnicodeEscapeSequence) 不是“$”、“_”或与 UnicodeID开始词法生成。

          标识符部分::\UnicodeEscapeSequence

          • 如果 SV(UnicodeEscapeSequence) 不是 "$" 或 "_" 或 的 UTF16Encoding (10.1.1) 或 将被匹配的 Unicode 代码点的 UTF16Encoding UnicodeID 继续词法生成。

          - ECMAScript 2015 Sepc

          基本上,IdentifierStart 指定您的密钥需要以$_ 或字母开头(也可以使用有效的Unicode escape sequences)。因此,当您尝试使用7sus4 时,您的密钥不会以上述任何一个开头,因此您将收到语法错误

          IdentifierPart 指定您不仅限于字母,因此您可以在您的键中包含数字。这意味着您的标识符并未严格定义为字母键(允许您混合使用数字字符和常规字母,例如:a1)。

          在您的情况下,您可以改为将对象键设为字符串,这将允许您以数字开头的键名:

          const parameters_table = {
              ...
              "7sus4": {D:4.7313,T:2.7964,M:0.2592}
          };
          

          你可以阅读更多关于 javascript 的命名规则here

          【讨论】:

          • 仅供参考:对于那些想知道SV(…)(如第 11.6.1 节中使用的)意味着什么的人。它在第 11.8.4.2 节中很方便地定义(显示为 SV,没有 ()。 [提示:8 >(大于)6。] 你应该阅读整个规范,不附加术语的含义,然后在稍后的心理“链接编辑”阶段或其他东西中理解它。剧透:意思是“字符串值”
          猜你喜欢
          • 2013-05-30
          • 2016-11-14
          • 2012-04-26
          • 2013-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-16
          相关资源
          最近更新 更多