Con el operador coalescente nulo ( ??
), uno se siente tentado a usarlo para especificar valores predeterminados para claves de objetos inexistentes, como se sugiere en una respuesta aquí , por ejemplo:
let a = foo.bar ?? 'default';
Sin embargo, sus alternativas en este caso (principalmente in
y hasOwnProperty
) tienen sus advertencias y riesgos. Llamar <key> in <object>
coincide con las claves en la cadena de prototipos de un objeto, como se explica aquí . Llamar <object>.hasOwnProperty(<key>)
no funcionará, por ejemplo, si hasOwnProperty
del objeto está sombreado, como se explica aquí . Seguramente, ??
tiene sus propias trampas a tener en cuenta.
¿Cuáles son las trampas con ??
en comparación con los otros métodos para verificar la existencia de una clave en cualquier objeto?
En otras palabras, son los riesgos de hacer lo siguiente:
let a = foo.bar ?? 'default';
más cerca de esto
let a = 'bar' in foo ? foo.bar : 'default';
O esto
let a = foo.hasOwnProperty('bar') ? foo.bar : 'default';
O esto
let a = Object.prototype.hasOwnProperty.call(foo, 'bar') ? foo.bar : 'default';
¿O son diferentes de cualquiera?
Los riesgos de los que está hablando son irrelevantes cuando sabe qué tipo de objeto esperar, en su caso particular, uno con una propiedad de bar
. No hay Object.prototype.bar
.
Los "riesgos" de usar ??
después de un acceso a la propiedad son exactamente los mismos que los riesgos de hacer el acceso a la propiedad. Su declaración let a = foo.bar ?? 'default';
es equivalente a
let a = foo.bar == null ? 'default' : foo.bar;
o (sin acceder dos veces a la propiedad)
let a = foo.bar; if (a == null) a = 'default';