【发布时间】:2017-05-14 22:42:30
【问题描述】:
在 Node.js 的 REPL(也在 SpiderMonkey 中测试过)序列
var foo = null;
(foo) = "bar";
有效,foo 随后等于 "bar",而不是 null。
这似乎违反直觉,因为人们会认为括号至少会取消引用 bar 并抛出 Invalid left-hand side in assignment`。
可以理解,当你做任何有趣的事情时,它确实会以上述方式失败。
(foo, bar) = 4
(true ? bar : foo) = 4
根据ECMA-262 on LeftHandExpressions(据我所知)没有有效的非终结符会导致括号被接受。
有什么我没看到的吗?
【问题讨论】:
-
我会猜到destructuring assignment,但它只有方括号和大括号
-
猜括号只是强制里面的计算,
(foo) === foo,我们也有(true ? foo : bar) === foo;(都正确)。 -
@wostex "这里是一个分组操作符" --- 如果是的话,那就是语法错误。
-
@TERMtm 不知道我是否真的走在正确的轨道上,但根据规范(您链接的那个),12.2.1.5 的第二个词法分析器规则定义了一个
CoverParenthesizedExpressionAndArrowParameterList符合IsValidSimpleAssignmentTarget,产生其内部expr。 -
(foo)在这种情况下不是分组运算符,就像方法调用(obj.foo)()在obj.foo周围没有分组运算符一样。相比之下,(0, obj.foo)()确实包含分组运算符。前面的调用将obj作为this上下文传递给foo(就像obj.foo()),后面的调用没有。见Why comma operator changesthisin function call。
标签: javascript ecma