Playground Proposal: Mallet operator

The mallet operator is similar to the current memoization operator,
except it can be used outside of just objects.

In Ruby, it’s almost the same as `a = a || b`. Note that only `nil` and
`false` are falsey in Ruby. I’ve defined it as `== null`, though that
could be changed to any JS falsey value.
This commit is contained in:
Justin Ridgewell
2015-01-16 01:14:28 -05:00
parent 76b8945207
commit 616640a128
5 changed files with 189 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
obj ||= {};
obj.x ||= 2;
console.log(obj.x ||= 2);
obj.x.x ||= 2;
console.log(obj.x.x ||= 2);
obj[x()] ||= 2;
console.log(obj[x()] ||= 2);
obj[y()][x()] ||= 2;
console.log(obj[y()][x()] ||= 2);

View File

@@ -0,0 +1,56 @@
var obj = {};
obj.x ||= 2;
assert.equal(obj.x, 2);
obj = {};
assert.equal(obj.x ||= 2, 2);
obj = { x: 1 };
obj.x ||= 2;
assert.equal(obj.x, 1);
obj = { x: 1 };
assert.equal(obj.x ||= 2, 1);
obj = { x: undefined }
obj.x ||= 2;
assert.equal(obj.x, 2);
obj = { x: undefined }
assert.equal(obj.x ||= 2, 2);
obj = { x: null }
obj.x ||= 2;
assert.equal(obj.x, 2);
obj = { x: null }
assert.equal(obj.x ||= 2, 2);
obj = { x: false }
obj.x ||= 2;
assert.equal(obj.x, false);
obj = { x: false }
assert.equal(obj.x ||= 2, false);
obj = undefined;
obj ||= 2;
assert.equal(obj, 2);
obj = undefined;
assert.equal(obj ||= 2 , 2);
obj = 1;
obj ||= 2;
assert.equal(obj, 1);
obj = 1;
assert.equal(obj ||= 2 , 1);
obj = null;
obj ||= 2;
assert.equal(obj, 2);
obj = null;
assert.equal(obj ||= 2 , 2);

View File

@@ -0,0 +1,29 @@
"use strict";
var _obj$x2, _x2, _obj$y2, _x4;
if (obj == null) obj = {};
if (obj.x == null) obj.x = 2;
console.log((obj.x == null && (obj.x = 2), obj.x));
var _obj$x = obj.x;
if (_obj$x.x == null) _obj$x.x = 2;
console.log((_obj$x2 = obj.x, _obj$x2.x == null && (_obj$x2.x = 2), _obj$x2.x));
var _x = x();
if (obj[_x] == null) obj[_x] = 2;
console.log((_x2 = x(), obj[_x2] == null && (obj[_x2] = 2), obj[_x2]));
var _obj$y = obj[y()];
var _x3 = x();
if (_obj$y[_x3] == null) _obj$y[_x3] = 2;
console.log((_obj$y2 = obj[y()], _x4 = x(), _obj$y2[_x4] == null && (_obj$y2[_x4] = 2), _obj$y2[_x4]));