Я натрапив на приклад коду, який використовував це порівняння:
var someVar = 0;
Object.is(false, someVar); //Returns false
Я знаю false == 0, trueщо саме тому ми і маємо ===.
Чим Object.isвідрізняється від ===?
Я натрапив на приклад коду, який використовував це порівняння:
var someVar = 0;
Object.is(false, someVar); //Returns false
Я знаю false == 0, trueщо саме тому ми і маємо ===.
Чим Object.isвідрізняється від ===?
Відповіді:
===називається оператором суворого порівняння в 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, які можна знайти за посиланням, поданим вище.
.xна рядок рядки це Stringоб'єкт (а не рядкове примітивне значення), і порівняння буде між об'єктом і рядком - це дуже тонка і є непростою - статики уникають цих проблем, статичні методи простіші та простіші у використанні.
document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.isвикористовує алгоритм SameValue специфікації , тоді як ===використовує алгоритм суворої рівності . Примітка про алгоритм суворої рівності зазначає різницю:
Цей алгоритм відрізняється від алгоритму SameValue ... в його обробці підписаних нулів і NaN.
Зауважте, що:
NaN === NaNпомилково, але Object.is(NaN, NaN)правда+0 === -0правда, але Object.is(+0, -0)неправда-0 === +0правда, але Object.is(-0, +0)неправдаУ JavaScript є щонайменше чотири види "рівності":
==), де операнди будуть змушені намагатися зрівняти їх. Правила чітко визначені , але неочевидні. ( "" == 0є true; "true" == trueє false, ...).===), де операнди різних типів не будуть примусові (і не будуть рівними), але див. Примітку вище про NaNі позитивний та негативний нуль.Object.is).SameValueвиняток, +0і -0вони однакові замість різних (використовуються як Mapдля клавіш, так і від Array.prototype.includes).Існує також еквівалентність об'єктів , яка не забезпечується мовою чи самим часом виконання, але зазвичай виражається як: Об'єкти мають той самий прототип, однакові властивості, і значення їх властивості однакові (за певним розумним визначенням "те саме" ).
- Якщо 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. В іншому випадку поверніть помилкове.
- Якщо Type (x) відрізняється від Type (y), поверніть false.
- Якщо Тип (x) - Число, то
- Якщо x NaN, поверніть false.
- Якщо y - NaN, поверніть хибне.
- Якщо x - те саме значення числа, що і y, поверніть true.
- Якщо x дорівнює +0, а y -0, поверніть true.
- Якщо x дорівнює -0 і y дорівнює +0, поверніть true.
- Повернути помилково.
- Повернути SameValueNonNumber (x, y).
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
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
Коротше кажучи, вони схожі, але Object.isрозумніші та точніші ...
Давайте розглянемо це ...
+0 === -0 //true
Але це не зовсім правильно, оскільки це ігнорує -і +раніше ...
Тепер ми використовуємо:
Object.is(+0, -0) //false
Як бачите, це порівняно точніше.
Також у випадку NaNцього більше схоже на правильне, як вважати будь-яке NaNте саме