Español

Domina el operador de nullish coalescing (??) de JavaScript para asignaciones de valores predeterminados más limpias y eficientes. Aprende cómo difiere del operador OR (||) y mira ejemplos prácticos.

JavaScript Nullish Coalescing: Una Guía Completa para la Asignación de Valores Predeterminados

En JavaScript, asignar valores predeterminados es una tarea común. Tradicionalmente, los desarrolladores han utilizado el operador OR (||) para este propósito. Sin embargo, el operador nullish coalescing (??), introducido en ECMAScript 2020, proporciona una forma más precisa y confiable de manejar las asignaciones de valores predeterminados, específicamente cuando se trata de valores null o undefined. Esta guía proporciona una inmersión profunda en el operador nullish coalescing, explorando su sintaxis, comportamiento, diferencias con el operador OR y casos de uso prácticos.

¿Qué es Nullish Coalescing?

El operador nullish coalescing (??) es un operador lógico que devuelve su operando del lado derecho cuando su operando del lado izquierdo es null o undefined. De lo contrario, devuelve su operando del lado izquierdo. En términos más simples, proporciona un valor predeterminado solo cuando una variable es estrictamente null o undefined.

Sintaxis

La sintaxis para el operador nullish coalescing es sencilla:

leftOperand ?? rightOperand

Aquí, leftOperand es la variable o expresión que desea verificar si es null o undefined, y rightOperand es el valor predeterminado que desea asignar si leftOperand es realmente null o undefined.

Ejemplo

Considere el siguiente ejemplo:

const username = null ?? "Guest";
console.log(username); // Output: Guest

const age = undefined ?? 25;
console.log(age); // Output: 25

const city = "London" ?? "Unknown";
console.log(city); // Output: London

En este ejemplo, a username se le asigna el valor predeterminado "Guest" porque inicialmente es null. De manera similar, a age se le asigna 25 porque comienza como undefined. Sin embargo, city conserva su valor original, "London", porque no es ni null ni undefined.

Valores Nullish vs. Falsy

Es crucial comprender la diferencia entre valores nullish y falsy en JavaScript. Un valor nullish es null o undefined. Un valor falsy es un valor que se considera falso cuando se encuentra en un contexto booleano. Los valores falsy incluyen:

La distinción clave es que el operador nullish coalescing solo verifica si es null o undefined, mientras que el operador OR (||) verifica cualquier valor falsy.

La Diferencia Entre ?? y ||

El operador OR (||) es un operador OR lógico que devuelve el operando del lado derecho si el operando del lado izquierdo es falsy. Si bien se puede usar para asignar valores predeterminados, puede conducir a un comportamiento inesperado cuando se trata de valores como 0 o una cadena vacía.

Ejemplo: Los Peligros de ||

const quantity = 0 || 10; // Pretendemos un valor predeterminado de 10 si falta la cantidad
console.log(quantity); // Output: 10 (¡Inesperado!) porque 0 es falsy

const text = '' || 'Default Text'; //Pretendemos un texto predeterminado si falta el texto
console.log(text); // Output: Default Text (¡Inesperado!) porque '' es falsy

En el primer ejemplo, pretendíamos asignar una cantidad predeterminada de 10 solo si faltaba quantity (null o undefined). Sin embargo, debido a que 0 es un valor falsy, el operador OR asignó incorrectamente el valor predeterminado. De manera similar, la cadena vacía hace que se muestre el texto predeterminado incluso si la cadena existe (pero está vacía).

Usando ?? para Precisión

Reescribamos el ejemplo anterior usando el operador nullish coalescing:

const quantity = 0 ?? 10;
console.log(quantity); // Output: 0 (¡Correcto!)

const text = '' ?? 'Default Text';
console.log(text); // Output: '' (¡Correcto!)

Ahora, la salida es la esperada. El operador nullish coalescing solo verifica si es null o undefined, por lo que 0 y '' se tratan como valores válidos y se conservan sus valores originales.

Casos de Uso para Nullish Coalescing

El operador nullish coalescing es útil en varios escenarios donde necesita proporcionar valores predeterminados solo cuando una variable es estrictamente null o undefined. Aquí hay algunos casos de uso comunes:

1. Manejo de Parámetros de Función Opcionales

Cuando define una función con parámetros opcionales, puede usar el operador nullish coalescing para proporcionar valores predeterminados si no se proporcionan los parámetros.

function greet(name, greeting) {
  const userName = name ?? "User";
  const userGreeting = greeting ?? "Hello";
  console.log(`${userGreeting}, ${userName}!`);
}

greet(); // Output: Hello, User!
greet("Alice"); // Output: Hello, Alice!
greet("Bob", "Greetings"); // Output: Greetings, Bob!

2. Establecer Opciones de Configuración Predeterminadas

Cuando trabaja con objetos de configuración, puede usar el operador nullish coalescing para asegurarse de que se utilicen los valores predeterminados si no se especifican ciertas opciones de configuración.

const config = {
  timeout: 5000,
  retries: 3
};

function fetchData(options) {
  const timeout = options.timeout ?? 10000; // Tiempo de espera predeterminado de 10 segundos
  const retries = options.retries ?? 5; // 5 reintentos predeterminados
  console.log(`Timeout: ${timeout}, Retries: ${retries}`);
}

fetchData(config); // Output: Timeout: 5000, Retries: 3
fetchData({}); // Output: Timeout: 10000, Retries: 5
fetchData({timeout:null, retries: undefined}); // Output: Timeout: 10000, Retries: 5

3. Acceso a Propiedades de Objetos Anidados

Cuando acceda a propiedades de objetos anidados, el operador nullish coalescing se puede combinar con el encadenamiento opcional (?.) para proporcionar valores predeterminados si alguna de las propiedades intermedias es null o undefined.

const user = {
  profile: {
    address: {
      city: "New York"
    }
  }
};

const cityName = user?.profile?.address?.city ?? "Unknown";
console.log(cityName); // Output: New York

const unknownUser = {};
const unknownCityName = unknownUser?.profile?.address?.city ?? "Unknown";
console.log(unknownCityName); // Output: Unknown

4. Trabajar con API y Datos Externos

Cuando obtenga datos de API o fuentes externas, el operador nullish coalescing se puede usar para proporcionar valores predeterminados si faltan ciertos campos de datos o tienen valores null o undefined. Considere la posibilidad de recuperar datos de usuario de diferentes regiones. Suponga que algunas regiones pueden no incluir el campo `country` en sus datos de usuario.

async function getUserData(userId) {
  try {
    const response = await fetch(`https://api.example.com/users/${userId}`);
    const data = await response.json();
    const country = data.country ?? "Unknown Country";
    const timezone = data.timezone ?? "UTC";
    console.log(`User is from: ${country}, Timezone: ${timezone}`);
  } catch (error) {
    console.error("Error fetching user data:", error);
  }
}

// Simulating different API responses:
const userWithCountry = { name: "John", country: "USA", timezone: "EST" };
const userWithoutCountry = { name: "Jane", timezone: "GMT" };

// To test this, you would need an actual API or mock fetch.
// For demonstration purposes, let's simulate the responses:
global.fetch = async (url) => {
    if (url.includes("123")) {
        return { json: async () => userWithCountry };
    } else if (url.includes("456")) {
        return { json: async () => userWithoutCountry };
    }
    throw new Error("Unexpected URL");
};

getUserData(123); // Output: User is from: USA, Timezone: EST
getUserData(456); // Output: User is from: Unknown Country, Timezone: GMT

Precedencia del Operador

El operador nullish coalescing tiene una precedencia de operador relativamente baja. Es más baja que los operadores OR (||) y AND (&&). Por lo tanto, al combinar el operador nullish coalescing con otros operadores lógicos, es esencial usar paréntesis para definir explícitamente el orden de las operaciones. No hacerlo puede resultar en errores de sintaxis o un comportamiento inesperado.

Ejemplo: Usando Paréntesis para Mayor Claridad

// Sin paréntesis (SyntaxError)
// const result = false || null ?? "Default"; // SyntaxError: Unexpected token '??'

// Con paréntesis (Correcto)
const result = false || (null ?? "Default");
console.log(result); // Output: Default

const anotherResult = (false || null) ?? "Default";
console.log(anotherResult); // Output: null

En el primer ejemplo, la falta de paréntesis da como resultado un SyntaxError porque el motor de JavaScript no puede determinar el orden de las operaciones previsto. Al agregar paréntesis, le decimos explícitamente al motor que evalúe primero el operador nullish coalescing. El segundo ejemplo es válido; sin embargo, la salida es diferente porque la expresión `||` se evalúa primero.

Compatibilidad del Navegador

El operador nullish coalescing (??) es una característica relativamente nueva, por lo que es crucial tener en cuenta la compatibilidad del navegador, especialmente si se dirige a navegadores más antiguos. La mayoría de los navegadores modernos admiten el operador nullish coalescing, incluyendo:

Si necesita admitir navegadores más antiguos, puede usar un transpilador como Babel para convertir su código a una versión compatible de JavaScript. Babel transformará el operador ?? en código JavaScript equivalente que funcione en entornos más antiguos.

Mejores Prácticas

Aquí hay algunas de las mejores prácticas para usar el operador nullish coalescing de manera efectiva:

Consideraciones Globales

Al desarrollar para una audiencia global, considere los siguientes puntos relacionados con las asignaciones de valores predeterminados:

Ejemplo: Localización con Nullish Coalescing

Digamos que desea mostrar un mensaje de bienvenida predeterminado en diferentes idiomas según la configuración regional del usuario. Puede usar el operador nullish coalescing para proporcionar un mensaje predeterminado si un mensaje localizado no está disponible.

function getWelcomeMessage(locale) {
  const localizedMessages = {
    en: "Welcome!",
    fr: "Bienvenue !",
    de: "Willkommen!"
  };

  const message = localizedMessages[locale] ?? "Welcome!"; // Predeterminado a inglés si no se encuentra la configuración regional
  return message;
}

console.log(getWelcomeMessage("fr")); // Output: Bienvenue !
console.log(getWelcomeMessage("es")); // Output: Welcome! (Predeterminado a inglés)

Conclusión

El operador nullish coalescing (??) es una valiosa adición al lenguaje JavaScript. Proporciona una forma más precisa y confiable de asignar valores predeterminados en comparación con el operador OR (||), especialmente cuando se trata de valores como 0 o cadenas vacías. Al comprender su sintaxis, comportamiento y casos de uso, puede escribir código más limpio y mantenible que maneje con precisión las asignaciones de valores predeterminados. Recuerde tener en cuenta la compatibilidad del navegador, la precedencia del operador y las consideraciones globales al usar el operador nullish coalescing en sus proyectos.

Al seguir las mejores prácticas descritas en esta guía, puede aprovechar de manera efectiva el operador nullish coalescing para mejorar la calidad y la confiabilidad de su código JavaScript, haciéndolo más robusto y fácil de entender. Recuerde siempre priorizar la claridad y la mantenibilidad en su código, y el operador nullish coalescing puede ser una herramienta poderosa para lograr estos objetivos.