这种比较行为是否定义明确?
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.4。 x !== (x = y)
会得到 x
的值 before 将 y
的值赋给 x
.
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.4。 x !== (x = y)
会得到 x
的值 before 将 y
的值赋给 x
.