我知道这里有很多 EloqJS 问题,但我还没有看到这个问题,这让我陷入了困境。我很好奇对象条目中的关键松鼠(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
最佳答案
因为对象键是文字:它们不会在运行时更改,也不会充当要替换为值的变量。
如果您查看 object initialiser section of the spec (11.1.5) ,它指定对象文字由属性名称/值列表组成,属性名称定义为以下之一:
IdentifierName
StringLiteral
NumericLiteral
IdentifierName
的规则 are defined in section 7.6包括大多数 unicode 字符,但不包括保留字或空格。
任何 IdentifierName
都可以用引号括起来成为有效的 StringLiteral
,尽管反之并不总是正确的(StringLiteral
包含标点符号或空格需要引号才有效)。您也可以使用以下方法定义对象:
{'events': [], 'squirrel': squirrel}
从 ES6 开始,现在有一个符号来指定键应该是变量的值,而不是它自己的标识符或文字。这是 defined in section 12.2.6作为 ComputedPropertyName
,使用 [expr]
语法。对于具有 true: true
属性的对象,您可以使用 ES6 代码:
{'events': [], [squirrel]: squirrel}
关于javascript - Eloquent Javascript - 关于参数对象的第 4 章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007748/