Hrvatski

Savladajte JavaScript operator spajanja za null vrijednosti (??) za čišće i učinkovitije dodjeljivanje zadanih vrijednosti. Naučite kako se razlikuje od OR operatora (||) i pogledajte praktične primjere.

JavaScript operator spajanja za null vrijednosti (??): Sveobuhvatan vodič za dodjelu zadanih vrijednosti

U JavaScriptu je dodjeljivanje zadanih vrijednosti čest zadatak. Programeri su tradicionalno u tu svrhu koristili OR operator (||). Međutim, operator spajanja za null vrijednosti (??), uveden u ECMAScript 2020, pruža precizniji i pouzdaniji način rukovanja dodjelom zadanih vrijednosti, posebno kada se radi o vrijednostima null ili undefined. Ovaj vodič pruža detaljan uvid u operator spajanja za null vrijednosti, istražujući njegovu sintaksu, ponašanje, razlike u odnosu na OR operator i praktične slučajeve upotrebe.

Što je operator spajanja za null vrijednosti (Nullish Coalescing)?

Operator spajanja za null vrijednosti (??) je logički operator koji vraća svoj desni operand kada je njegov lijevi operand null ili undefined. U suprotnom, vraća svoj lijevi operand. Jednostavnije rečeno, on pruža zadanu vrijednost samo kada je varijabla strogo null ili undefined.

Sintaksa

Sintaksa za operator spajanja za null vrijednosti je jednostavna:

leftOperand ?? rightOperand

Ovdje je leftOperand varijabla ili izraz koji želite provjeriti na null ili undefined, a rightOperand je zadana vrijednost koju želite dodijeliti ako je leftOperand doista null ili undefined.

Primjer

Razmotrite sljedeći primjer:

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

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

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

U ovom primjeru, varijabli username dodijeljena je zadana vrijednost "Guest" jer je početno null. Slično tome, varijabli age dodijeljeno je 25 jer počinje kao undefined. Međutim, city zadržava svoju izvornu vrijednost, "London", jer nije ni null ni undefined.

Nullish vs. Falsy vrijednosti

Ključno je razumjeti razliku između nullish i falsy vrijednosti u JavaScriptu. Nullish vrijednost je ili null ili undefined. Falsy vrijednost je vrijednost koja se smatra neistinitom (false) kada se nađe u booleovom kontekstu. Falsy vrijednosti uključuju:

Ključna razlika je u tome što operator spajanja za null vrijednosti provjerava samo null ili undefined, dok OR operator (||) provjerava bilo koju falsy vrijednost.

Razlika između ?? i ||

OR operator (||) je logički ILI operator koji vraća desni operand ako je lijevi operand falsy. Iako se može koristiti za dodjeljivanje zadanih vrijednosti, može dovesti do neočekivanog ponašanja pri radu s vrijednostima kao što su 0 ili prazan string.

Primjer: Zamke operatora ||

const quantity = 0 || 10; // Namjeravamo postaviti zadanu vrijednost 10 ako količina nedostaje
console.log(quantity); // Izlaz: 10 (Neočekivano!) jer je 0 falsy

const text = '' || 'Default Text'; // Namjeravamo postaviti zadani tekst ako tekst nedostaje
console.log(text); // Izlaz: Default Text (Neočekivano!) jer je '' falsy

U prvom primjeru, namjeravali smo dodijeliti zadanu količinu od 10 samo ako je quantity nedostajala (null ili undefined). Međutim, budući da je 0 falsy vrijednost, OR operator je netočno dodijelio zadanu vrijednost. Slično tome, prazan string uzrokuje prikazivanje zadanog teksta čak i ako string postoji (ali je prazan).

Korištenje ?? za preciznost

Napišimo prethodni primjer ponovno koristeći operator spajanja za null vrijednosti:

const quantity = 0 ?? 10;
console.log(quantity); // Izlaz: 0 (Točno!)

const text = '' ?? 'Default Text';
console.log(text); // Izlaz: '' (Točno!)

Sada je izlaz onakav kakav se očekuje. Operator spajanja za null vrijednosti provjerava samo null ili undefined, stoga se 0 i '' tretiraju kao važeće vrijednosti, a njihove izvorne vrijednosti su sačuvane.

Slučajevi upotrebe operatora spajanja za null vrijednosti

Operator spajanja za null vrijednosti koristan je u različitim scenarijima gdje trebate pružiti zadane vrijednosti samo kada je varijabla strogo null ili undefined. Evo nekih uobičajenih slučajeva upotrebe:

1. Rukovanje opcionalnim parametrima funkcije

Kada definirate funkciju s opcionalnim parametrima, možete koristiti operator spajanja za null vrijednosti kako biste pružili zadane vrijednosti ako parametri nisu navedeni.

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

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

2. Postavljanje zadanih konfiguracijskih opcija

Kada radite s konfiguracijskim objektima, možete koristiti operator spajanja za null vrijednosti kako biste osigurali da se koriste zadane vrijednosti ako određene konfiguracijske opcije nisu navedene.

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

function fetchData(options) {
  const timeout = options.timeout ?? 10000; // Zadano vrijeme čekanja od 10 sekundi
  const retries = options.retries ?? 5; // Zadanih 5 pokušaja
  console.log(`Timeout: ${timeout}, Retries: ${retries}`);
}

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

3. Pristupanje ugniježđenim svojstvima objekta

Prilikom pristupanja svojstvima ugniježđenih objekata, operator spajanja za null vrijednosti može se kombinirati s opcionalnim ulančavanjem (?.) kako bi se pružile zadane vrijednosti ako su neka od međusvojstava null ili undefined.

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

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

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

4. Rad s API-jevima i vanjskim podacima

Prilikom dohvaćanja podataka iz API-ja ili vanjskih izvora, operator spajanja za null vrijednosti može se koristiti za pružanje zadanih vrijednosti ako određena polja podataka nedostaju ili imaju vrijednosti null ili undefined. Razmotrite dohvaćanje korisničkih podataka iz različitih regija. Pretpostavite da neke regije možda neće uključivati polje `country` u svojim korisničkim podacima.

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(`Korisnik je iz: ${country}, Vremenska zona: ${timezone}`);
  } catch (error) {
    console.error("Greška pri dohvaćanju korisničkih podataka:", error);
  }
}

// Simuliranje različitih odgovora API-ja:
const userWithCountry = { name: "John", country: "USA", timezone: "EST" };
const userWithoutCountry = { name: "Jane", timezone: "GMT" };

// Da biste ovo testirali, trebat će vam stvarni API ili lažni fetch.
// U svrhu demonstracije, simulirajmo odgovore:
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); // Izlaz: Korisnik je iz: USA, Vremenska zona: EST
getUserData(456); // Izlaz: Korisnik je iz: Unknown Country, Vremenska zona: GMT

Prioritet operatora

Operator spajanja za null vrijednosti ima relativno nizak prioritet. Niži je od OR (||) i AND (&&) operatora. Stoga, pri kombiniranju operatora spajanja za null vrijednosti s drugim logičkim operatorima, ključno je koristiti zagrade kako bi se eksplicitno definirao redoslijed operacija. Ako to ne učinite, može doći do sintaksnih pogrešaka ili neočekivanog ponašanja.

Primjer: Korištenje zagrada za jasnoću

// Bez zagrada (SyntaxError)
// const result = false || null ?? "Default"; // SyntaxError: Unexpected token '??'

// Sa zagradama (Točno)
const result = false || (null ?? "Default");
console.log(result); // Izlaz: Default

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

U prvom primjeru, nedostatak zagrada rezultira greškom SyntaxError jer JavaScript mehanizam ne može odrediti namjeravani redoslijed operacija. Dodavanjem zagrada, eksplicitno kažemo mehanizmu da prvo procijeni operator spajanja za null vrijednosti. Drugi primjer je valjan; međutim, izlaz je drugačiji jer se prvo procjenjuje izraz s ||.

Kompatibilnost s preglednicima

Operator spajanja za null vrijednosti (??) je relativno nova značajka, stoga je ključno uzeti u obzir kompatibilnost s preglednicima, posebno ako ciljate starije preglednike. Većina modernih preglednika podržava operator spajanja za null vrijednosti, uključujući:

Ako trebate podržati starije preglednike, možete koristiti transpiler poput Babela kako biste svoj kôd pretvorili u kompatibilnu verziju JavaScripta. Babel će transformirati operator ?? u ekvivalentan JavaScript kôd koji radi u starijim okruženjima.

Najbolje prakse

Evo nekoliko najboljih praksi za učinkovito korištenje operatora spajanja za null vrijednosti:

Globalna razmatranja

Prilikom razvoja za globalnu publiku, uzmite u obzir sljedeće točke vezane za dodjelu zadanih vrijednosti:

Primjer: Lokalizacija s operatorom spajanja za null vrijednosti

Recimo da želite prikazati zadanu poruku dobrodošlice na različitim jezicima ovisno o lokalitetu korisnika. Možete koristiti operator spajanja za null vrijednosti kako biste pružili zadanu poruku ako lokalizirana poruka nije dostupna.

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

  const message = localizedMessages[locale] ?? "Welcome!"; // Zadano na engleski ako lokalitet nije pronađen
  return message;
}

console.log(getWelcomeMessage("fr")); // Izlaz: Bienvenue !
console.log(getWelcomeMessage("es")); // Izlaz: Welcome! (Postavlja se na engleski kao zadani)

Zaključak

Operator spajanja za null vrijednosti (??) je vrijedan dodatak JavaScript jeziku. On pruža precizniji i pouzdaniji način dodjeljivanja zadanih vrijednosti u usporedbi s OR operatorom (||), posebno pri radu s vrijednostima kao što su 0 ili prazni stringovi. Razumijevanjem njegove sintakse, ponašanja i slučajeva upotrebe, možete pisati čišći, lakše održiv kôd koji točno rukuje dodjelom zadanih vrijednosti. Ne zaboravite uzeti u obzir kompatibilnost s preglednicima, prioritet operatora i globalna razmatranja pri korištenju operatora spajanja za null vrijednosti u svojim projektima.

Slijedeći najbolje prakse navedene u ovom vodiču, možete učinkovito iskoristiti operator spajanja za null vrijednosti kako biste poboljšali kvalitetu i pouzdanost svog JavaScript kôda, čineći ga robusnijim i lakšim za razumijevanje. Zapamtite da uvijek dajete prednost jasnoći i održivosti u svom kôdu, a operator spajanja za null vrijednosti može biti moćan alat u postizanju tih ciljeva.

JavaScript operator spajanja za null vrijednosti (??): Sveobuhvatan vodič za dodjelu zadanih vrijednosti | MLOG