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

Is this comparison behavior well-defined?

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 不可变映射实现 returns 本身,如果突变导致没有实际变化。

除非对这有多丑进行潜在分析/'clever',我很好奇这是否是 ES5+ 中明确定义的行为。似乎依赖于从左到右的评估,因为相同的结构表示为

var thisWontWork = ((x = y) !== x);

永远不会计算为 true

在 Chrome (40) 中工作。

是的,评估顺序在 Ecmascript 中定义明确 § 11.9.4x !== (x = y) 会得到 x 的值 before y 的值赋给 x.