`??=` is being merged into the Logical Assignment Operator proposal, and the overall proposal will wait until nullish coalescing is finalized.
50 lines
814 B
JavaScript
50 lines
814 B
JavaScript
var x = undefined;
|
|
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);
|
|
|
|
var gets = 0;
|
|
var deep = {
|
|
get obj() {
|
|
gets++;
|
|
return obj;
|
|
},
|
|
};
|
|
|
|
obj.x = undefined;
|
|
assert.equal(deep.obj.x ??= 1, 1);
|
|
assert.equal(gets, 1);
|
|
assert.equal(deep.obj.x ??= 2, 1);
|
|
assert.equal(gets, 2);
|
|
|
|
var key = 0;
|
|
obj.x = undefined;
|
|
assert.equal(obj[++key] ??= 1, 1);
|
|
assert.equal(key, 1);
|
|
key = 0;
|
|
assert.equal(obj[++key] ??= 2, 1);
|
|
assert.equal(key, 1);
|
|
|
|
obj.x = undefined;
|
|
key = 0;
|
|
assert.equal(deep.obj[++key] ??= 1, 1);
|
|
assert.equal(gets, 3);
|
|
assert.equal(key, 1);
|
|
key = 0;
|
|
assert.equal(deep.obj[++key] ??= 2, 1);
|
|
assert.equal(gets, 4);
|
|
assert.equal(key, 1);
|