Justin Ridgewell 55bf55398a
Logical Assignment: ensure computed key isn't recomputed (#7604)
* Logical Assignment: ensure computed key isn't recomputed

* More tests
2018-03-20 23:06:09 +00:00

73 lines
1.3 KiB
JavaScript

var x = 0;
var sets = 0;
var obj = {
get x() {
return x;
},
set x(value) {
sets++;
x = value;
},
};
assert.equal(obj.x ||= 1, 1);
assert.equal(sets, 1);
assert.equal(obj.x ||= 2, 1);
assert.equal(sets, 1);
assert.equal(obj.x &&= 0, 0);
assert.equal(sets, 2);
assert.equal(obj.x &&= 3, 0);
assert.equal(sets, 2);
var gets = 0;
var deep = {
get obj() {
gets++;
return obj;
},
};
assert.equal(deep.obj.x ||= 1, 1);
assert.equal(gets, 1);
assert.equal(deep.obj.x ||= 2, 1);
assert.equal(gets, 2);
assert.equal(deep.obj.x &&= 0, 0);
assert.equal(gets, 3);
assert.equal(deep.obj.x &&= 3, 0);
assert.equal(gets, 4);
var key = 0;
assert.equal(obj[++key] ||= 1, 1);
assert.equal(key, 1);
key = 0;
assert.equal(obj[++key] ||= 2, 1);
assert.equal(key, 1);
key = 0;
assert.equal(obj[++key] &&= 0, 0);
assert.equal(key, 1);
key = 0;
assert.equal(obj[++key] &&= 3, 0);
assert.equal(key, 1);
key = 0;
assert.equal(deep.obj[++key] ||= 1, 1);
assert.equal(gets, 5);
assert.equal(key, 1);
key = 0;
assert.equal(deep.obj[++key] ||= 2, 1);
assert.equal(gets, 6);
assert.equal(key, 1);
key = 0;
assert.equal(deep.obj[++key] &&= 0, 0);
assert.equal(gets, 7);
assert.equal(key, 1);
key = 0;
assert.equal(deep.obj[++key] &&= 3, 0);
assert.equal(gets, 8);
assert.equal(key, 1);