Object.is()

Vérifie si deux valeurs sont identiques. Elle ne diffère de === que pour NaN, ainsi que pour 0 et -0.

Renvoie
true si les valeurs sont identiques, sinon false.
Modifie l’original
Non
Sur cette page

Exemple

#
JavaScript
console.log(Object.is('Léa', 'Léa'))
console.log(Object.is(NaN, NaN))
console.log(NaN === NaN)
console.log(Object.is(0, -0))
console.log(0 === -0)
Console
true
true
false
false
true

Définition et utilisation

#

La méthode Object.is(a, b) renvoie true quand les deux valeurs sont la même valeur. Elle fonctionne presque comme === : elle ne convertit pas les types, et compare les objets par référence, donc deux objets distincts avec un contenu identique ne sont pas égaux entre eux.

Il n’y a que deux différences. Object.is(NaN, NaN) renvoie true, alors que NaN === NaN donne false. À l’inverse, Object.is(0, -0) renvoie false, alors que 0 === -0 donne true. Le zéro négatif apparaît par exemple avec -1 * 0 ou Math.round(-0.4). La méthode includes() ainsi que les collections Map et Set utilisent une comparaison intermédiaire : chez elles, NaN est égal à NaN, et 0 et -0 sont égaux aussi.

Au quotidien, === suffit. Object.is() est utile dans du code qui doit détecter chaque changement de valeur, par exemple dans des bibliothèques qui comparent un état. React utilise justement cet algorithme pour vérifier si une nouvelle valeur d’état diffère de la précédente.

Syntaxe

#
Syntaxe
Object.is(value1, value2)

Paramètres

#
  • value1

    valeur quelconque

    La première valeur comparée.
  • value2

    valeur quelconque

    La seconde valeur comparée.

Plus d’exemples

#
Les objets sont comparés par référence
JavaScript
const settings = { theme: 'dark' }
const sameSettings = settings
const copy = { ...settings }

console.log(Object.is(settings, sameSettings))
console.log(Object.is(settings, copy))
Console
true
false
D’où vient -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))
Console
[-0, -0, -0]
[true, true, true]
[true, true, true]
Détecter un changement d’état
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))
Console
false
true
false

Un changement de champ sur le même objet n’est pas détecté, car la référence n’a pas changé. C’est pourquoi l’état dans React est mis à jour avec une nouvelle copie de l’objet, plutôt qu’en modifiant les champs de l’ancien.

Compatibilité des navigateurs

#

Largement disponible

Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.

  • Chrome
  • Edge
  • Firefox
  • Safari

Bonnes pratiques

#
  • Pour vérifier NaN, Number.isNaN(value) est plus clair à lire. Réservez Object.is() aux cas où vous avez besoin d’une comparaison générale de valeurs quelconques.
  • Object.is() ne compare pas le contenu des objets. Pour cela, il vous faut votre propre fonction qui compare les champs, ou une fonction prête à l’emploi provenant d’une bibliothèque.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.