JavaScriptObiekty i klasy

Object.is()

Sprawdza, czy dwie wartości są takie same. Od === różni się tylko dla NaN oraz dla 0 i -0.

Zwraca
true, jeśli wartości są takie same, w przeciwnym razie false.
Zmienia oryginał
Nie
Na tej stronie

Przykład

#
JavaScript
console.log(Object.is('Ania', 'Ania'))
console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)
console.log(Object.is(0, -0))
console.log(0 === -0)
Konsola
true
true
false
false
true

Definicja i zastosowanie

#

Metoda Object.is(a, b) zwraca true, gdy obie wartości są tą samą wartością. Działa prawie jak ===: nie zamienia typów, a obiekty porównuje przez referencję, więc dwa osobne obiekty o identycznej zawartości nie są sobie równe.

Różnice są tylko dwie. Object.is(NaN, NaN) zwraca true, choć NaN === NaN daje false. Z kolei Object.is(0, -0) zwraca false, choć 0 === -0 daje true. Ujemne zero powstaje np. przy -1 * 0 albo Math.round(-0.4). Metoda includes() oraz kolekcje Map i Set stosują porównanie pośrednie: NaN jest w nich równe NaN, a 0 i -0 też są sobie równe.

Na co dzień wystarcza ===. Object.is() przydaje się w kodzie, który musi wykryć każdą zmianę wartości, np. w bibliotekach porównujących stan. React używa właśnie tego algorytmu, żeby sprawdzić, czy nowa wartość stanu różni się od poprzedniej.

Składnia

#
Składnia
Object.is(value1, value2)

Parametry

#
  • value1

    dowolna wartość

    Pierwsza porównywana wartość.
  • value2

    dowolna wartość

    Druga porównywana wartość.

Więcej przykładów

#
Obiekty porównywane przez referencję
JavaScript
const settings = { theme: 'dark' }
const sameSettings = settings
const copy = { ...settings }

console.log(Object.is(settings, sameSettings))
console.log(Object.is(settings, copy))
Konsola
true
false
Skąd bierze się -0
JavaScript
const values = [Math.round(-0.4), -1 * 0, 0 / -5]

console.log(values)
console.log(values.map((value) => Object.is(value, -0)))
console.log(values.map((value) => value === 0))
Konsola
[-0, -0, -0]
[true, true, true]
[true, true, true]
Wykrywanie zmiany stanu
JavaScript
function hasChanged(previous, next) {
  return !Object.is(previous, next)
}

const state = { points: 10 }
const mutated = state
mutated.points = 20

console.log(hasChanged(state, mutated))
console.log(hasChanged(state, { ...state, points: 30 }))
console.log(hasChanged(NaN, NaN))
Konsola
false
true
false

Zmiana pola w tym samym obiekcie nie jest wykrywana, bo referencja się nie zmieniła. Dlatego stan w React aktualizuje się nową kopią obiektu, a nie zmianą pól starego.

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Do sprawdzania NaN czytelniejsze jest Number.isNaN(value). Object.is() zostaw na sytuacje, w których potrzebujesz ogólnego porównania dowolnych wartości.
  • Object.is() nie porównuje zawartości obiektów. Do tego potrzebujesz własnej funkcji porównującej pola albo gotowej funkcji z biblioteki.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.