这种比较行为是否定义明确?

时间:2015-02-25 12:26:15

标签: javascript specifications readability

var x = 'foo';
var y = 'bar';

var isItDefined = (x !== (x = y)); // true, once
var isItAssigned = (x === 'bar'); // true

这个成语对于使用Immutable.js检查不变性突变非常方便,即

if (myMap !== (myMap = myMap.set('x', 2))) { changed.emit(); }

IIRC如果变异没有实际变化,则不可变映射实现会自行返回。

除非潜在地分析这是多么丑陋/“聪明”,否则我很好奇这是否是ES5 +中明确定义的行为。似乎依赖于从左到右的评估,就像表达为

的结构一样
var thisWontWork = ((x = y) !== x);

不会评估为true

适用于Chrome(40)。

1 个答案:

答案 0 :(得分:2)

是的,评估顺序在Ecmascript § 11.9.4中有明确定义。 <{1}}在将x !== (x = y)的值分配给x之前会y 的价值。