【问题标题】:JavaScript assoc array with negative int keys带有负 int 键的 JavaScript 关联数组
【发布时间】:2011-11-18 12:09:46
【问题描述】:

我似乎无法定义如下内容:

var a = {-1: 'Apple', -2: 'Orange'}

我的 Safari 抱怨 syntax error near '-'。括号也无济于事,即{(-1): ... - 在这种情况下,Safari 不喜欢开头的括号。

如果我希望键只是整数而不是字符串,那么构造 assoc 数组的正确方法是什么?

【问题讨论】:

  • 是否有不使用字符串的令人信服的理由?即:var a = { "-1": "Apple" };.
  • 你知道所有的键都是字符串吗? var a = { 1: 2} 只会将 1 转换为 "1"
  • @Raynos,谢谢,不知道,这就解释了一切。
  • @Raynos,如果您发布答案,我会接受。
  • @mojuba 将 Zack 的答案标记为正确

标签: javascript


【解决方案1】:

参见ECMAScript Language Specification 的第 11.1.5 节:您将看到 PropertyName 确实可能是 NumericLiteral,但规范的第 7.8.3 节表明 NumericLiteral 不能以减号开头。在您的示例中看起来像否定的“文字”实际上是由一元运算符 - 和 NumericLiterals 组成的表达式。

但是,PropertyName 可能不是表达式:它只能是标识符名称、数字文字或表明您可以编写的字符串文字

{'-1': 'Apple', '-2': 'Orange'}

感谢GetFree 找到正确的解释!

【讨论】:

  • 不是这个原因。您引用的部分解释了数字文字无论如何都会在内部转换为字符串,因此在用作键时两者之间没有区别。不能使用负数的实际原因是因为负数是一个表达式(一个减号后跟一个数字字面量),并且您不能将表达式用作对象字面量中的键。
  • 你是对的。 7.8.3 节暗示数字文字不能以减号开头,11.1.5 节暗示表达式可能不是属性名称。这确实是正确的解释。谢谢!
【解决方案2】:

只需将它们用引号括起来。您仍然可以使用数字访问:

var a = {"-1": 'Apple', "-2": 'Orange'}
a[-1]; // Apple;

【讨论】:

  • 这很明显,我在问题中说我需要它们是整数,而不是字符串。正确的答案是内部键总是字符串,所以没有理由不引用它们。
  • “我需要它们成为整数”到底是什么意思?您不能提供负数,因为 key 需要是文字值,而 - 是一元负运算符,使其成为表达式。
  • 在 JavaScript 中,当您期望某些内容是数字而不是字符串时,可能会产生后果,例如i + 1 会根据 i 的类型产生不同的结果。但是这个问题已经得到了回答:在 JavaScript 中,键总是被转换为字符串。
  • + 运算符重载,但a["1"]a[1] 相同。我不确定您期望的不同行为。
  • 考虑for (var i in a) { if (a[i + 1])...。很高兴知道i 始终是一个字符串,无论您如何构造数组。
【解决方案3】:

引用对我有用:

var a = {'-1': 'Apple', '-2': 'Orange'};
console.log(a[-1]);

【讨论】:

    【解决方案4】:

    我最近遇到了这个案例,截至 2018 年,ES6 的一件新事情是你可以简单地做到这一点:

    var a = {[-1]: 'Apple', [-2]: 'Orange'}
    

    你甚至可以在那里传递变量(这应该与上面的结果相同):

    var i = 0;
    var a = {[--i]: 'Apple', [--i]: 'Orange'}
    

    这里提到https://stackoverflow.com/a/11508490/9063787

    【讨论】:

      【解决方案5】:

      没有办法使键为负整数。如果你想做一个否定键,你必须把它们变成这样的字符串:

      var a = {"-1": 'Apple', "-2": 'Orange'}
      

      如果需要,您可以在其他代码中使用 parseInt 和 toString 来回转换。

      【讨论】:

        猜你喜欢
        • 2012-07-04
        • 2014-02-12
        • 2022-10-08
        • 1970-01-01
        • 1970-01-01
        • 2017-03-16
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        相关资源
        最近更新 更多