<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Given input valid JSON JSON.parse() or JSON.stringify() replacer function can be utilized to substitute "undefined" for null.<div><br></div><div>```</div><div>const convertJSONNullToUndefined = json => </div><div>  Object.assign({}</div><div>  // if input is valid JSON string omit JSON.stringify(), use JSON.parse() with same replacer function</div><div>  // e.g., JSON.parse(`{"x":null,"y":null,"z":null}`, (key, value) => value === null ? `${void 0}` : value)</div><div>  , ...Object.entries(JSON.parse(JSON.stringify(json, (key, value) => value === null ? `${void 0}` : value)))</div><div>    .map(([key, value]) => value === `${void 0}` ? {[key]: void value} : value ));</div><div>// {x: "undefined", y: "undefined", z: "undefined"}<br></div><div>const {z = "a"} = convertJSONNullToUndefined({ x: null, y:null, z: null }); // "a" assigned to z</div><div>```</div><div><br></div><div>Alternatively RegExp can be used to replace JSON string values</div><div><br></div><div>```</div><div>const convertJSONNullToUndefined = json => </div><div>  Object.assign({}, </div><div>  ...function*() { </div><div>    // negative lookahead to match ":" followed by null followed by comma or closing curly bracket character</div><div>    // replace null with "undefined"</div><div>    const o = JSON.parse(JSON.stringify(json).replace(/(?![:])null(?=[,}])/g, `"${void 0}"`)); </div><div>    for (const key in o) {yield {[key]: void o[key]}}</div><div>  }());</div><div>// {x: "undefined", y: "undefined", z: "undefined"}</div><div>const {z = "a"} = convertJSONNullToUndefined({ x: null, y:null, z: null }); // "a" assigned to z<br></div><div>```</div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 2, 2019 at 8:23 AM Cyril Auburtin <<a href="mailto:cyril.auburtin@gmail.com">cyril.auburtin@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Similarly to <div><br></div><div>```js</div><div>const { x = 'a' } = {}; // z === 'a'</div><div>const { y = 'a' } = { y: undefined }; // z === 'a'<br></div><div>const { z = 'a' } = { z: null }; // z === null<br></div><div>```</div><div>I'd like to propose</div><div><br></div><div><div>```js</div><div><div>const { x =? 'a' } = {}; // z === 'a'</div><div>const { y =? 'a' } = { y: undefined }; // z === 'a'<br></div><div>const { z =? 'a' } = { z: null }; // z === 'a'</div></div><div>```</div></div><div>Which would handle also null values in default cases</div><div><br></div><div>This is because default destructuring introduced in ES6 doesn't handle null values, null values in JSON are quite common from APIs, it'd be convenient</div><div><br></div><div>It's also inspired by the null-coalescing operator <a href="https://github.com/tc39/proposal-nullish-coalescing" target="_blank">https://github.com/tc39/proposal-nullish-coalescing</a></div></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>