Object.is vs ===


141

Я натрапив на приклад коду, який використовував це порівняння:

var someVar = 0;
Object.is(false, someVar); //Returns false 

Я знаю false == 0, trueщо саме тому ми і маємо ===.

Чим Object.isвідрізняється від ===?

Відповіді:


174

===називається оператором суворого порівняння в JavaScript. Object.isі суворий оператор порівняння поводиться точно так само, за винятком NaNі +0/-0.

Від MDN:

Object.is()метод не те саме, що бути рівним за ===оператором. ===Оператор (і ==оператор, а) обробляють значення чисел -0 і +0 як рівні і лікують , Number.NaNяк не дорівнює NaN.

Код нижче підкреслює різницю між ===та Object.is().

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true

введіть тут опис зображення

Ви можете знайти більше прикладів тут .

Примітка : Object.isє частиною пропозиції ECMAScript 6 і ще не підтримується широко (наприклад, вона не підтримується жодною версією Internet Explorer або багатьма старими версіями інших браузерів). Однак ви можете використовувати полі-заливку для веб-переглядачів, які не є ES6, які можна знайти за посиланням, поданим вище.


26
Перший рядок відповіді повинен бути: "Вони поводяться точно так само, крім NaN та +0 і -0", ймовірно.
Бенджамін Груенбаум

1
@BenjaminGruenbaum Гарна пропозиція. Полегшує читання відповіді. Ура.
Gurpreet Singh

3
@ humble.rumble це обговорювалося надовго - статичні методи простіші - у них немає проблем з контекстом або примітивних проблем. Наприклад, у вашому прикладі я очікував би помилкового, але новачки в JS очікували б істинних, оскільки роблячи .xна рядок рядки це Stringоб'єкт (а не рядкове примітивне значення), і порівняння буде між об'єктом і рядком - це дуже тонка і є непростою - статики уникають цих проблем, статичні методи простіші та простіші у використанні.
Бенджамін Груенбаум

2
@ humble.rumble Для порівняння вузлів DOM вже існує такий метод, див. isEqualNode . Приклад:document.createElement('div').isEqualNode(document.createElement('div')) === true
Rob W

2
Оновлення 2017 року: Object.is () зараз широко підтримується у всіх основних браузерах.
Стерлінг Борн

56

Object.isвикористовує алгоритм SameValue специфікації , тоді як ===використовує алгоритм суворої рівності . Примітка про алгоритм суворої рівності зазначає різницю:

Цей алгоритм відрізняється від алгоритму SameValue ... в його обробці підписаних нулів і NaN.

Зауважте, що:

  • NaN === NaNпомилково, але Object.is(NaN, NaN)правда
  • +0 === -0правда, але Object.is(+0, -0)неправда
  • -0 === +0правда, але Object.is(-0, +0)неправда

У JavaScript є щонайменше чотири види "рівності":

  • "Loose" ( ==), де операнди будуть змушені намагатися зрівняти їх. Правила чітко визначені , але неочевидні. ( "" == 0є true; "true" == trueє false, ...).
  • "Строгий" ( ===), де операнди різних типів не будуть примусові (і не будуть рівними), але див. Примітку вище про NaNі позитивний та негативний нуль.
  • SameValue - як зазначено вище (використовується Object.is).
  • SameValueZero - як SameValueвиняток, +0і -0вони однакові замість різних (використовуються як Mapдля клавіш, так і від Array.prototype.includes).

Існує також еквівалентність об'єктів , яка не забезпечується мовою чи самим часом виконання, але зазвичай виражається як: Об'єкти мають той самий прототип, однакові властивості, і значення їх властивості однакові (за певним розумним визначенням "те саме" ).


Алгоритм SameValue :

  • Якщо Type (x) відрізняється від Type (y), поверніть false.
  • Якщо Тип (x) - Число, то
    • Якщо x - NaN, а y - NaN, поверніть true.
    • Якщо x дорівнює +0, а y -0, поверніть значення false.
    • Якщо x дорівнює -0, а y +0, поверніть значення false.
    • Якщо x - те саме значення числа, що і y, поверніть true.
    • Повернути помилково.
  • Повернути SameValueNonNumber (x, y).

... де SameValueNonNumber :

  • Затвердження: Тип (х) - не число.
  • Ствердження: Тип (х) такий же, як Тип (у).
  • Якщо Type (x) не визначено, поверніть true.
  • Якщо Type (x) - Null, поверніть true.
  • Якщо Type (x) - String, то
    • Якщо x і y точно однакові послідовності одиниць коду (однакова довжина та однакові одиниці коду при відповідних індексах), поверніть true; в іншому випадку поверніть помилкове.
  • Якщо Type (x) булевий, то
    • Якщо x і y істинні, або обидва помилкові, поверніть істинне; в іншому випадку поверніть помилкове.
  • Якщо Type (x) - символ, то
    • Якщо x і y одно і те ж значення Symbol, поверніть true; в іншому випадку поверніть помилкове.
  • Повернути істину, якщо x і y є однаковими значеннями Object. В іншому випадку поверніть помилкове.

Алгоритм суворої рівності :

  1. Якщо Type (x) відрізняється від Type (y), поверніть false.
  2. Якщо Тип (x) - Число, то
    • Якщо x NaN, поверніть false.
    • Якщо y - NaN, поверніть хибне.
    • Якщо x - те саме значення числа, що і y, поверніть true.
    • Якщо x дорівнює +0, а y -0, поверніть true.
    • Якщо x дорівнює -0 і y дорівнює +0, поверніть true.
    • Повернути помилково.
  3. Повернути SameValueNonNumber (x, y).

2

Object.is = function(v1, v2){
  //test for `-0`
  if(v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
  }
  
  //test for `NaN`
  if(v1 !== v1) {
    return v2 !== v2;
  }
  
  //everything else
  return v1 === v2;
}

Вищенаведене - функція поліфункції, яка показує, як Object.isпрацює, для всіх, хто цікавиться. Посилання на You-Don't-Know-JS


2

Підсумок:

Object.is()Функція приймає 2 значення в якості аргументів і повертає істину , якщо 2 наведені значення точно так же , в іншому випадку він повертає брехня.

Навіщо нам це потрібно?

Ви можете подумати, у нас вже є чітка рівність (чеки типу + значення) перевірка в javascript з ===оператором, навіщо нам потрібна ця функція? Ну а строга рівність у деяких випадках недостатня, і вони такі:

console.log(NaN === NaN);   // false
console.log(-0 === +0);     // true

Object.is() допомагає нам, порівнюючи ці значення, щоб побачити, чи вони схожі, чого не може зробити оператор суворої рівності.

console.log(Object.is(NaN, NaN));  // true
console.log(Object.is(-0, 0));     // false
console.log(Object.is(+0, +0));    // true
console.log(Object.is(+0, -0));    // false


0

Коротше кажучи, вони схожі, але Object.isрозумніші та точніші ...

Давайте розглянемо це ...

+0 === -0 //true

Але це не зовсім правильно, оскільки це ігнорує -і +раніше ...

Тепер ми використовуємо:

Object.is(+0, -0) //false

Як бачите, це порівняно точніше.

Також у випадку NaNцього більше схоже на правильне, як вважати будь-яке NaNте саме

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.