consdata.com
Technical blog Business blog HR department
PL
javascript

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

author Piotr Grobelny
19 April 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
Newest posts

  • Reliable event delivery in Apache Kafka based on retry and DLQ
  • Event Tracking - finding a needle in a haystack
  • Kouncil - a modern Kafka frontend
Join us

  • 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

technical

newsletter

Sign up

Podobne wpisy

post-image
kouncil

Reliable event delivery in Apache Kafka based on retry and DLQ

Why is there no DLQ in Kafka? Most popular queueing systems such as RabbitMQ or ActiveMQ have built-in systems responsible for reliable message delivery. So why doesn't Kafka offer one?...

author
Jacek Grobelny 13 Sep 2021
post-image
kouncil

Event Tracking - finding a needle in a haystack

Event tracking allows for tracking and visualising the path of a given event or process through Kafka topics.

author
Marcin Mergo 8 Sep 2021
post-image
kouncil

Kouncil - a modern Kafka frontend

Kouncil is a modern Kafka frontend equipped with features essential for developers.

author
Jacek Grobelny 30 Aug 2021
Join us

  • 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

Sign up for a

technical

newsletter

consdata.com
  • Contact

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

  • Office

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

  • Solutions

    • Eximee
    • Kouncil
  • Blog Join us
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ę