Search code examples
javascriptnullundefinedidiomscoercion

Is there a JavaScript idiom to change "undefined" to "null"?


There's quite a few JavaScript idioms that coerce between types and similar things.

! can convert anything falsey to boolean true, !! can convert anything falsey to actual boolean false, + can convert true, false, or a string representing a number into an actual number, etc.

Is there something similar that converts undefined to null?

Now I'm using ternary ? : but it would be cool to know if I'm missing a useful trick.


OK, let me contrive an example ...

function callback(value) {
  return value ? format(value) : null;
}

callback is called by 3rd party code which sometimes passes undefined.
The 3rd party code can handle null being passed back, but not undefined. format() is also 3rd party and can't handle being passed either undefined or null.


Solution

  • Javascript now supports a null-coalescing operator: ??. It may not be production-ready (consult the support table), but it's certainly safe to use with Node or a transpiler (TypeScript, Babel, etc.).

    Per MDN,

    The nullish coalescing operator (??) is a logical operator that returns its right-hand side operand when its left-hand side operand is null or undefined, and otherwise returns its left-hand side operand.

    Much as || can provide a "default" value when the left operand is falsey, ?? provides a "default" value if the left operand is null or undefined. You can use this to coerce undefined to null:

        // OR operator can coerce 'defined' values
        "value"   || null;    // "value"
        0         || null;    // null
        false     || null;    // null
        ""        || null;    // null
        undefined || null;    // null
        
        // The null-coalescing operator will only coerce undefined or null
        "value"   ?? null;    // "value"
        0         ?? null;    // 0
        false     ?? null;    // false
        ""        ?? null;    // ""
        undefined ?? null;    // null
    

    An example based on the question:

        function mustNotReturnUndefined(mightBeUndefined) { // can return null
            // Substitute empty string for null or undefined
            let result = processValue(mightBeUndefined ?? "");
    
            // Substitute null for undefined
            return result ?? null;
        }