【问题标题】:Eloquent Javascript - Chapter 4 on The Arguments ObjectEloquent Javascript - 第 4 章论参数对象
【发布时间】:2015-09-09 13:05:23
【问题描述】:

我知道这里有很多 EloqJS 问题,但我还没有看到有人问过这个问题,这让我陷入了困境。我很好奇对象条目中的key squirrel (squirrel: squirrel) 是如何不被这段代码中函数传递的参数替换的:

 function addEntry(squirrel) {
  var entry = {events: [], squirrel: squirrel};
  for (var i = 1; i < arguments.length; i++)
    entry.events.push(arguments[i]);
  journal.push(entry);
}
addEntry(true, "work", "touched tree", "pizza",
         "running", "television");

我希望它进入 {events: [], true: true},但这不是它返回的内容。我在这里显然错过了什么?原代码http://eloquentjavascript.net/04_data.html#arguments_object

【问题讨论】:

  • 您不能使用对象文字符号将变量传递到对象键中,这就是原因。为此,它应该是 entry[squirrel] = squirrel。

标签: javascript arrays variables arguments


【解决方案1】:

因为对象键是字面量:它们不会在运行时更改或充当要替换为值的变量。

如果您查看object initialiser section of the spec (11.1.5),它指定对象字面量由属性名称/值列表组成,属性名称定义为以下之一:

IdentifierName
StringLiteral
NumericLiteral

IdentifierNameare defined in section 7.6 的规则包括大多数 unicode 字符,但不包括保留字或空格。

任何IdentifierName 都可以用引号括起来成为有效的StringLiteral,尽管反过来并不总是正确的(包含标点符号或空格的StringLiterals 需要引号才有效)。您也可以使用以下方法定义对象:

{'events': [], 'squirrel': squirrel}

从 ES6 开始,现在有一个表示法来指定键应该是变量的值,而不是它自己的标识符或文字。这是defined in section 12.2.6 作为ComputedPropertyName,使用[expr] 语法。对于具有true: true 属性的对象,您可以使用 ES6 代码:

{'events': [], [squirrel]: squirrel}

【讨论】:

    【解决方案2】:

    这是因为 Object Literal Notation 无法接收变量作为对象键。

    例如:

    var name = "John";
    var person = {
      name: name
    }
    // person = { name: "John" }
    
    var name = "John";
    var person = {};
    person[name] = name;
    // person = { "John": "John" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      相关资源
      最近更新 更多