我希望JavaScript能够将具有重复属性的对象拒绝为无效,但在某些情况下它会接受它们.
{"a":4,"a":5}结果在SyntaxError由于性质至少在Firefox和铬这似乎明显a被限定两次.
但是({"a":4,"a":5})评估得很好,导致{"a":5}Firefox和Chrome 中的对象.
为什么接受括号的表达式?
总结响应:第一个例子不是构造一个对象而是一个带标签的语句块.对象中的重复特性完全有效,在这种情况下,最后一个定义获胜.
非常感谢你的回答!
在ECMAScript 3中,在对象文字中声明重复的属性是完全合法的。在SyntaxError你得到可能来自你所使用的对象字面的说法,这是不可能的事实,由于与语句块中的困惑({ doSomething(); })。
如果您希望将其报告为错误,则可能要切换到ECMAScript 5的严格模式:https : //developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode。
如果将其分配给变量,您所说的没有问题,但是如果不这样做,您会收到您提到的错误。从语法的角度来看,这完全不同。
当您将任何结构包装在括号中时,您会导致该语法被计算为表达式,其结果存储为临时变量。在 Firefox 中不这样做时出现的错误是意外标签或无效标签,因此似乎没有赋值或括号,该对象构造不被视为对象构造 - 相反,它被视为具有多个标签语句的块非法定义:
{
a: function(){
alert('a');
},
b: function(){
alert('b');
}
}
Run Code Online (Sandbox Code Playgroud)
上面的内容作为一个对象应该是完全可以接受的,但是如果您在没有将其分配给某种形式的变量或使用括号对其进行评估的情况下对其进行评估,则会出现类似的错误。简而言之,属性名称的重复不会导致错误:)
基本上想象一下你的第一个例子,但像这样:
function (){
"a": 4,
"b": 5
}
Run Code Online (Sandbox Code Playgroud)
这些浏览器大致就是这样对待它的,现在这显然是非法的 JavaScript 语法……而以前并不那么明显。