此比较行为是否定义良好

Is this comparison behavior well-defined?

本文关键字:定义 是否 比较      更新时间:2024-05-04
var x = 'foo';
var y = 'bar';
var isItDefined = (x !== (x = y)); // true, once
var isItAssigned = (x === 'bar'); // true

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

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

IIRC 如果突变没有导致实际更改,则不可变映射实现将返回自身。

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

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

永远不会评估到true.

适用于铬 (40(。

是的,评估顺序在 Ecmascript § 11.9.4 中有很好的定义。 x !== (x = y) 将在将 y 的值分配给 x 之前获取 x 的值。