consdata.com
Blog techniczny Blog biznesowy Dział HR
EN
javascript

Czy wiesz, jak używać operatorów "?" i "!" w JavaScript i TypeScript?

author Piotr Grobelny
19 kwietnia 2024

Wykrzykniki i znaki zapytania mogą czasami wprawić w zakłopotanie, ponieważ dalece im w kodzie od swojego interpunkcyjnego znaczenia.

Na początek spójrzmy na wykrzyknik. W TypeScript może być on używany jako tzw. non-null assertion operator. Oznacza to, że znak ! możemy potraktować jako informację dla kompilatora, że dana zmienna nie będzie miała wartości null ani undefined w momencie użycia.

let dlugosc: number = zmienna.length;  // Błąd kompilacji, ponieważ zmienna może być null
let dlugosc: number = zmienna!.length; // Kompilator taką linijkę kodu przepuści

Jest to do pewnego stopnia obejście mechanizmu sprawdzania typów i powinno się go używać z rozwagą. Taki kod staje się mniej czytelny, a kompilator przestaje kontrolować miejsca, które mogą spowodować wystąpienie błędu w czasie działania programu. Rozważniejszym podejściem jest weryfikowanie, czy zmienna nie ma wartości null lub undefined i osobna obsługa takich sytuacji.

W czystym JavaScript ! przed zmienną działa jako operator negacji logicznej. Kiedy używamy go przed wyrażeniem lub zmienną, neguje wartość logiczną tego wyrażenia. Na przykład:

let prawda = true;
let falsz = !prawda; // falsz = false

Operator neguje wartość zmiennej, dodatkowo konwertując ją na zmienną typu boolean. Wiedząc to, możemy używać podwójnego zaprzeczenia !!, aby konwertować wartości na korespondującą z nimi wartości boolean. Poniżej kilka przykładów:

!!""        // zwraca false
!!"wartość" // zwraca true
!!0         // zwraca false
!!1         // zwraca true
!![1, 2]    // zwraca true
!![]        // zwraca... true

!! występuje w kodzie raczej rzadko, ale warto wiedzieć, co oznacza.

Pozostał nam jeszcze znak zapytania. Zacznijmy od TypeScript. Możemy się nim posłużyć definiując interfejs, aby wskazać, które pola są opcjonalne:

interface Person {
  name: string;
  age?: number; // age jest opcjonalne
}
 
const person: Person = { name: 'John' }; // Nie powoduje błędu kompilacji

Z kolei w JavaScript może służyć jako operator warunkowy do zapisywania wyrażenia if-else w skróconej formie:

const age = 20;
const canVote = age >= 18 ? true : false;

W przypadku prostych warunków, które weryfikują istnienie wartości, warto wykorzystać operator ?? (null coalescing operator), który zwróci wartość po lewej stronie operatora jeśli jest ona różna od null i undefined, a w przeciwnym wypadku - po prawej stronie.

null ?? "hello"      // "hello"
undefined ?? "hello" // "hello"
"world" ?? "hello"   // "world"
"" ?? "hello"        // ""
0 ?? "hello"         // 0

Warto tutaj wspomnieć, że operator alternatywy || działa bardzo podobnie, ale dla dwóch ostatnich przykładów zwróciłby inną wartość (opiera się on na wartości logicznej a nie null czy undefined), więc nie można tych operatorów stosować zamiennie.

"" || "hello"        // "hello"
0 || "hello"         // "hello"

Znak zapytania jest używany również jako operator zabezpieczający przed błędami, który pozwala na dostęp do właściwości obiektu, nawet jeśli nie jest ona zdefiniowana (optional chaining).

const person = {
  name: 'John',
  address: {
    city: 'New York',
  },
};

 const country = person.address?.country; // Jeśli address nie istnieje, zwróci undefined i nie spowoduje wystąpienia błędu

Przydatne linki:

  • https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_operator
  • https://www.typescriptlang.org/docs/handbook/2/objects.html#property-modifiers
Najnowsze wpisy

  • Czy wiesz, że w Jest można automatycznie testować dostępność (a11y)?
  • Dostępność w PDF - dokumenty bez barier
  • Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

newsletter

techniczny

Zapisz się

Podobne wpisy

post-image
wcag

Czy wiesz, że w Jest można automatycznie testować dostępność (a11y)?

author
Wojciech Stolarski 19 maj 2025
post-image
WCAG

Dostępność w PDF - dokumenty bez barier

author
Kacper Hoffman 28 kwi 2025
post-image
angular

Czy wiesz, że z pomocą @starting-style można animować elementy z display: none za pomocą samego CSS?

author
Piotr Tatarski 7 kwi 2025
Dołącz do nas

  • SENIOR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 14 900 - 20 590 PLN brutto
    B2B 19 680 - 27 220 PLN netto
  • REGULAR FULLSTACK DEVELOPER (JAVA + ANGULAR) Poznań (hybrydowo) lub zdalnie UoP 11 300 - 15 900 PLN brutto
    B2B 14 950 - 21 000 PLN netto
  • ZOBACZ WSZYSTKIE OGŁOSZENIA

Zapisz się na

newsletter

techniczny

consdata.com
  • Kontakt

    • sales@consdata.com
    • +48 61 41 51 000

  • Biuro

    • K9Office
      Krysiewicza 9/14
      61-825 Poznań
      Polska

  • Rozwiązania

    • Eximee
    • Kouncil
  • Blog Dołącz do nas
Copyright © 2024 Consdata. All rights reserved. Privacy Policy & Cookies
Chcemy używać plików cookie oraz skryptów podmiotów trzecich do polepszania funkcjonowania tej strony Zgadzam się