Я натрапив на приклад коду, який використовував це порівняння:
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
те саме