Сравнение оператори - JavaScript, MDN
- равенство ( "двойна равен") използва ==
- строг равенство (или "тройна добре" или "идентичен") използва ===
- и Object.is (иновации на ECMAScript 6).
Избор на оператор, зависи от вида на сравнение да се произвежда.
В общи линии, с двойна равни пред сравняват стойности произвежда гипс; тройна сравнява еднаква стойност без намаляване (ако количествата на различните видове, не се връщат фалшиви сравняване.); Object.is добре и се държи като тройна добре, но със специална обработка за NaN. 0 и 0. връщане фалшива, когато се сравняват 0 и -0. и вярно за работа Object.is (NaN, NaN). (Докато двойна или тройна връщане фалшиво равенство в съответствие със стандарт IEEE 754.) Следва да се отбележи, че всички тези различия в сравнения са валидни само за примитиви. За всеки не-примитивни обекти х и у. които имат една и съща структура, но са две отделни обекти (променливи х и у не се отнасят до един и същ обект), всички релационни оператори връщат фалшиви.
Сравнение с помощта ==
Преди да се сравняват оператор равенство задейства и двете стойности на общ тип. След редукция (единият или двата от операндите), крайният Сравнението се извършва, както и за ===. Операцията за сравнение е симетрична. А == B връща същата стойност като B == А за всички стойности на А и Б.
Следващата таблица обобщава резултатите от сравняването на оператора на половете за различни стойности:
В таблицата по-горе, ToNumber (A) се опитва преди сравнението доведе до броя на аргументите си. Това поведение е еквивалентна + A (унарна +). Ако ToPrimitive (А) получава обект като аргумент, опитите са направени, за да го приведе към примитивното, то и методи A.toString A.valueOf причинява.
Традиционно, (и съгласно ECMAScript). нито един от обектите не е определено или нула. Но повечето браузъри позволяват определен клас обекти (например, обекти document.all за всяка страница), за да подражават на стойност неопределено. Операторът на равенство връща важи и за нула == А и неопределена == А. Тогава и само тогава, когато обектът емулира стойността неопределено. Във всички останали случаи на обекта не може да бъде равен на нула или неопределен.
Някои предприемачи смятат, че тя винаги е по-добре да се използва строго оператора на половете, вместо да се сравнява с превръщането тип. Резултат строг равенство по-лесно да се предскаже, и съпоставяне на данните, без да се извежда тях може да получава печалби на скоростта.
Стриктно равенство с ===
Строги равни проверки за равенство на две величини, количества от всеки вид преди сравнението не се променя (не са показани). Ако стойностите са от различни видове, те не могат да бъдат равни. От друга страна не всички числови променливи, принадлежащи към един и същ вид, смятан за равно между тях, ако те съдържат същите стойности. И накрая, най-числени променливи са равни, ако имат една и съща стойност, или някой от дъното на 0. а вторият -0. В същото време, ако поне един от цифровата променливата съдържа стойността NaN. израз връща лъжа.
Почти винаги да се използва за сравняване на строг оператора на половете. За всички настройки, с изключение на очевидните семантиката използвани числен: стойността е равна само на себе си. Както бе споменато по-горе, две специални случаи могат да бъдат разграничени за цифрови видове. Първо, сравняване 0 и -0. Влезте за нула за цел опростяване някои изчисления с плаваща запетая, обаче, от гледна точка на математиката на, и разликата между 0 -0 не съществува, поради това, операторът на строг равенство ги счита за равен. На второ място, сравнението на стойностите Нан. NaN (Не номер) представлява стойността не е определена стойност, която се използва за не ясно определени математически проблеми (например + ∞ -∞ +). За оператора точно равен NaN не е равно на всяка стойност, включително и себе си (единственият случай, когато (х! == х) връща истина).
Равни количества от същите
Равенството същите стойности определя функционално идентични във всички контексти сравнение стойности. (Този метод се основава на принципа на заместване сравняване Барбара Лисков.) Разгледаме следния пример се опитва да промени неизменни (неизменни) свойства.
Ако се опитате да промените неизменни свойства, обадете Object.defineProperty хвърли изключение, обаче, ако новият Имотът е равен на по стария начин, промяната няма да се случи и не е изключение, ще бъдат изхвърлени. Ако срещу съдържа 0. промените няма да настъпят, което означава, че кодът ще работи без изключения освобождаване. Въпреки това, ако V съдържа 0. Number.NEGATIVE_ZERO загуби своята неизменна ценност. Това е за сравняване на нови настоящите и неизменни свойства, използвани за сравнение идентични количества, представени с Object.is.
Спецификации за равенство, строг равенство и равнопоставеност на същата величина
В ES5 стандарт сравнение извършва от оператора == описано в раздел 11.9.3, абстрактно половете алгоритъм. Описание === оператор е дадено в раздел 11.9.6, стриктното половете алгоритъм. В раздел 9.12, The SameValue Алгоритъм ES5 описва действието на сравнението на тези количества за вътрешния JS двигател. Стриктно справедливост и равни идентични стойности са почти идентични, с изключение на цифровите видове обработка. ES6 предлага да се използва алгоритъм за сравняване на еднакви количества, като се обадите Object.is.
Как да разберем всички тези методи за сравнение?
Сравнителна таблица на операторите за сравнение
Когато се използва Object.is?
Object.is нули обработка функция ще бъдат полезни в мета-програмирането, когато това е необходимо, за да се придаде стойност на имота от страна на противоположния дръжка Object.defineProperty. Ако вашите задачи не изисква от него, е по-добре да се въздържат от използване на Object.is. отказването ===. Дори ако кодът, който трябва да сравните два NaN. обикновено най-лесният начин да се използва съществуващият метод isNaN. в следващите изчисления не влияят на сравнението на нули с различни знаци.
Ето примери за оператори и методи, които могат да направят разликата между 0 и 0 по-ясен, което със сигурност ще се отрази в своя код:
Очевидно е, че използването на Унарният минус нула ще -0. Но, понякога, това е напълно невидим. Например:
Ако obj.velocity стойност е 0, тогава резултатът е -0 експресия. което в крайна сметка ще бъде отразена в променлива stoppingForce.
Math.atan2 Math.ceil Math.pow Math.round Много е вероятно, че тези методи могат да се върнат 0. дори и ако това не е изрично премина един от параметрите. Например, ако методът Math.pow изправени -Infinity всяка отрицателна степен. Вижте най-подробното описание на тези методи. Math.floor Math.max Math.min Math.sin Math.sqrt Math.tan В някои случаи, може да получите резултатът е -0. Ако по-горе методи на един от параметрите да преминат -0. Например, Math.min (-0, 0) връща -0. Вижте най-подробното описание на тези методи.
<<>> Всеки един от тези оператори използва вътрешен алгоритъм ToInt32. В него няма място за отрицателно нула, тъй като стойността -0 не оцелее такава операция. Това означава, че Object.is (
(-0) -0). и Object.is (-0 <<2>> 2 -0) ще се върне невярно.
От изложеното по-горе става ясно, че използването на Object.is понякога може да бъде проблематично. Разбира се, ако трябва да се направи ясно разграничение между 0 и 0. този метод е точно това, което ви трябва.