En omfattande guide till JavaScripts nullish coalescing-operator (??), som utforskar dess fördelar över logisk ELLER (||) för tilldelning av standardvÀrden och hantering av 'falsy'-vÀrden i olika scenarier.
JavaScript Nullish Coalescing: Tilldelning av standardvÀrde kontra hantering av 'falsy'-vÀrden
JavaScript-utvecklare behöver ofta tilldela standardvÀrden till variabler nÀr det ursprungliga vÀrdet saknas eller Àr ogiltigt. Traditionellt anvÀndes den logiska ELLER-operatorn (||) för detta ÀndamÄl. Men nullish coalescing-operatorn (??), som introducerades i ECMAScript 2020, erbjuder en mer exakt och tillförlitlig lösning, sÀrskilt vid hantering av 'falsy'-vÀrden. Denna omfattande guide utforskar nyanserna i nullish coalescing, jÀmför den med den logiska ELLER-operatorn och visar dess tillÀmpningar i olika scenarier.
FörstÄelse för Nullish Coalescing (??)
Nullish coalescing-operatorn (??) returnerar sin högra operand nÀr dess vÀnstra operand Àr null eller undefined. Annars returnerar den sin vÀnstra operand. Enklare uttryckt ger den ett standardvÀrde endast nÀr variabeln Àr explicit null eller undefined.
Syntax:
leftOperand ?? rightOperand
Exempel:
const name = null ?? "GĂ€st";
console.log(name); // Output: "GĂ€st"
const age = undefined ?? 25;
console.log(age); // Output: 25
const score = 0 ?? 100;
console.log(score); // Output: 0
Skillnaden mellan Nullish Coalescing (??) och logisk ELLER (||)
Den logiska ELLER-operatorn (||) ger ocksÄ ett sÀtt att tilldela standardvÀrden. Den behandlar dock alla 'falsy'-vÀrden (false, 0, '', NaN, null, undefined) som likvÀrdiga med null eller undefined, vilket kan leda till ovÀntat beteende.
Exempel med logisk ELLER:
const quantity = 0 || 10;
console.log(quantity); // Output: 10 (ovÀntat, eftersom 0 Àr 'falsy')
const message = '' || "Inget meddelande";
console.log(message); // Output: "Inget meddelande" (ovÀntat, eftersom '' Àr 'falsy')
Exempel med Nullish Coalescing:
const quantity = 0 ?? 10;
console.log(quantity); // Output: 0 (korrekt, eftersom 0 inte Àr null eller undefined)
const message = '' ?? "Inget meddelande";
console.log(message); // Output: "" (korrekt, eftersom '' inte Àr null eller undefined)
Som du kan se, aktiveras nullish coalescing-operatorn endast nÀr den vÀnstra operanden Àr explicit null eller undefined, vilket bevarar 'falsy'-vÀrden som 0 och ''.
AnvÀndningsfall för Nullish Coalescing
Nullish coalescing Àr sÀrskilt anvÀndbart i scenarier dÀr du behöver skilja mellan ett saknat vÀrde (null eller undefined) och ett giltigt 'falsy'-vÀrde.
1. Hantering av konfigurationsalternativ
NÀr du hanterar konfigurationsalternativ kanske du vill ange standardvÀrden för instÀllningar som inte har definierats explicit. AnvÀndning av ?? sÀkerstÀller att giltiga 'falsy'-vÀrden (t.ex. 0 för ett timeout-vÀrde) inte oavsiktligt ersÀtts med standardvÀrdet.
const config = {
timeout: 0,
maxRetries: null,
apiEndpoint: undefined
};
const timeout = config.timeout ?? 5000; // AnvÀnd 0 om timeout Àr explicit satt, annars standardvÀrde 5000
const maxRetries = config.maxRetries ?? 3; // AnvÀnd 3 om maxRetries Àr null eller undefined
const apiEndpoint = config.apiEndpoint ?? "https://example.com/api"; // AnvÀnd standard-endpoint om apiEndpoint Àr null eller undefined
console.log(`Timeout: ${timeout}, Max Retries: ${maxRetries}, API Endpoint: ${apiEndpoint}`);
// Output: Timeout: 0, Max Retries: 3, API Endpoint: https://example.com/api
2. Arbeta med API-svar
API-svar innehÄller ofta fÀlt som kan saknas eller ha explicit satta 'falsy'-vÀrden. Nullish coalescing lÄter dig hantera dessa scenarier smidigt och sÀkerstÀller att du endast tilldelar standardvÀrden nÀr ett fÀlt verkligen saknas.
Exempel: Ett förenklat API-svar som representerar en anvÀndare:
const user = {
name: "Alice",
age: 30,
countryCode: null,
acceptedTerms: false,
profilePictureURL: undefined
};
const displayName = user.name ?? "OkÀnd anvÀndare";
const userAge = user.age ?? "Ă
lder ej tillgÀnglig";
const country = user.countryCode ?? "US"; // StandardvÀrde 'US' om null/undefined
const hasAcceptedTerms = user.acceptedTerms ?? true; // StandardvÀrde 'true' om null/undefined
const profilePic = user.profilePictureURL ?? "/default-profile.png"; // Standardbild om null/undefined
console.log(`Namn: ${displayName}`); // Output: Namn: Alice
console.log(`Ă
lder: ${userAge}`); // Output: Ă
lder: 30
console.log(`Land: ${country}`); // Output: Land: US
console.log(`GodkÀnda villkor: ${hasAcceptedTerms}`); // Output: GodkÀnda villkor: false
console.log(`Profilbild: ${profilePic}`); //Output: Profilbild: /default-profile.png
I det hÀr exemplet sÀtter vi standardvÀrdet till "US" endast om `countryCode` Àr explicit null eller undefined. Om API:et returnerade `countryCode: ""`, skulle den tomma strÀngen bevaras, vilket Äterspeglar anvÀndarens faktiska (men potentiellt saknade) landskod.
3. TillhandahÄlla reservvÀrden i funktioner
NÀr du skriver funktioner som accepterar valfria parametrar kan nullish coalescing anvÀndas för att tillhandahÄlla standardvÀrden för saknade argument.
function greet(name, greeting) {
const displayName = name ?? "GĂ€st";
const salutation = greeting ?? "Hej";
return `${salutation}, ${displayName}!`;
}
console.log(greet("Bob", "God morgon")); // Output: God morgon, Bob!
console.log(greet(null, undefined)); // Output: Hej, GĂ€st!
console.log(greet("", "")); // Output: , !
console.log(greet("", null)); // Output: Hej, !
Detta tillvÀgagÄngssÀtt sÀkerstÀller att funktionen alltid har ett vÀrde att arbeta med, Àven om anroparen inte tillhandahÄller alla argument.
4. Internationalisering och lokalisering (i18n/l10n)
NÀr du arbetar med internationaliserade applikationer har du ofta olika översÀttningar för olika strÀngar. Nullish coalescing kan anvÀndas för att tillhandahÄlla en standardöversÀttning om en specifik översÀttning saknas för ett visst sprÄk.
const translations = {
en: {
greeting: "Hello",
farewell: "Goodbye"
},
fr: {
greeting: "Bonjour"
}
};
function translate(key, language) {
return translations[language]?.[key] ?? translations.en[key] ?? `ĂversĂ€ttning saknas för nyckel: ${key}`;
}
console.log(translate("greeting", "fr")); // Output: Bonjour
console.log(translate("farewell", "fr")); // Output: ĂversĂ€ttning saknas för nyckel: farewell
console.log(translate("greeting", "de")); // Output: Hello (faller tillbaka till engelska)
I det hÀr exemplet försöker vi först hitta översÀttningen för det angivna sprÄket och nyckeln. Om den saknas, faller vi tillbaka pÄ den engelska översÀttningen. Om Àven den engelska översÀttningen saknas, returnerar vi ett meddelande som indikerar att översÀttningen saknas.
5. Hantering av anvÀndarinmatning i formulÀr
NÀr du bearbetar anvÀndarinmatning frÄn formulÀr kan du stöta pÄ fall dÀr vissa fÀlt lÀmnas tomma eller innehÄller tomma strÀngar. Att anvÀnda nullish coalescing-operatorn tillsammans med optional chaining-operatorn (?.) kan vara mycket effektivt nÀr man hanterar djupt nÀstlad anvÀndarinmatning.
const formData = {
user: {
name: "",
address: {
city: null,
country: undefined
}
}
};
const userName = formData.user.name || "Inget namn angivet";
const safeUserName = formData?.user?.name ?? "Inget namn angivet";
const userCity = formData?.user?.address?.city ?? "Stad okÀnd";
const userCountry = formData?.user?.address?.country ?? "Land okÀnt";
console.log(userName); // Inget namn angivet (eftersom tom strÀng Àr 'falsy')
console.log(safeUserName); // "" (eftersom safeUserName explicit kontrollerar för null eller undefined)
console.log(userCity); // Stad okÀnd
console.log(userCountry); // Land okÀnt
Operatorprioritet och kombination med andra operatorer
Nullish coalescing-operatorn har en relativt lÄg operatorprioritet. Det innebÀr att du ofta behöver anvÀnda parenteser för att sÀkerstÀlla att den utvÀrderas korrekt, sÀrskilt nÀr den kombineras med andra operatorer som logisk OCH (&&) eller logisk ELLER (||).
Viktigt att notera: Du kan inte direkt kombinera ?? med && eller || utan att anvÀnda parenteser. Detta för att undvika tvetydighet i operationsordningen.
Korrekt anvÀndning:
const value = (someValue ?? 10) && true;
console.log(value); //Output: true om someValue inte Àr null eller undefined, annars false
const result = (null ?? 5) + 10; // Output: 15
Felaktig anvÀndning (resulterar i ett SyntaxError):
// const value = someValue ?? 10 && true; // SyntaxError: Unexpected token '&&'
// const result = null ?? 5 + 10; // SyntaxError: Unexpected number
WebblÀsarkompatibilitet
Nullish coalescing-operatorn (??) Àr ett relativt nytt tillÀgg i JavaScript. Se till att dina mÄlwebblÀsare stöder den. De flesta moderna webblÀsare stöder den, men Àldre webblÀsare kan krÀva transpilerling med verktyg som Babel.
För att kontrollera webblÀsarkompatibilitet kan du hÀnvisa till resurser som MDN Web Docs.
BÀsta praxis för att anvÀnda Nullish Coalescing
- AnvÀnd den nÀr du behöver skilja mellan saknade vÀrden (
nullellerundefined) och giltiga 'falsy'-vÀrden. - AnvÀnd alltid parenteser nÀr du kombinerar
??med&&eller||för att undvika syntaxfel och sÀkerstÀlla korrekt utvÀrdering. - Var medveten om webblÀsarkompatibilitet och övervÀg transpilerling vid behov.
- Dokumentera din anvÀndning av
??tydligt för att förbÀttra kodens lÀsbarhet. - Testa din kod noggrant för att sÀkerstÀlla att standardvÀrden tilldelas korrekt i alla scenarier.
Slutsats
Nullish coalescing-operatorn (??) Ă€r ett kraftfullt och vĂ€rdefullt tillĂ€gg till JavaScript-sprĂ„ket. Den erbjuder ett mer exakt och tillförlitligt sĂ€tt att tilldela standardvĂ€rden jĂ€mfört med den traditionella logiska ELLER-operatorn (||), sĂ€rskilt vid hantering av 'falsy'-vĂ€rden. Genom att förstĂ„ dess nyanser och bĂ€sta praxis kan du skriva renare, mer robust och mer underhĂ„llbar JavaScript-kod. ĂvervĂ€g att börja anvĂ€nda ?? i dina projekt för att förbĂ€ttra tydligheten och noggrannheten i dina tilldelningar av standardvĂ€rden. Kom ihĂ„g att testa din kod noggrant i olika webblĂ€sare och övervĂ€g transpilerling för Ă€ldre miljöer.
Denna guide gav en omfattande översikt. Experimentera med ?? i olika sammanhang för att fullt ut förstÄ dess kapacitet och begrÀnsningar, och fortsÀtt att förfina din förstÄelse genom praktisk tillÀmpning.