Natknąłem się na przykład kodu, który korzystał z tego porównania:
var someVar = 0;
Object.is(false, someVar); //Returns false
Wiem, że false == 0
tak będzie true
, dlatego mamy ===
.
Czym się Object.is
różni od ===
?
źródło
Natknąłem się na przykład kodu, który korzystał z tego porównania:
var someVar = 0;
Object.is(false, someVar); //Returns false
Wiem, że false == 0
tak będzie true
, dlatego mamy ===
.
Czym się Object.is
różni od ===
?
===
w JavaScript nazywa się operatorem ścisłego porównania. Object.is
i operator ścisłego porównania zachowują się dokładnie tak samo z wyjątkiem NaN
i +0/-0
.
Z MDN:
Object.is()
metoda to nie to samo, co bycie równym według===
operatora.===
Operatora (i==
napędu i) traktuje wartości liczby -0 i +0 jako równe i traktujeNumber.NaN
jako nierówneNaN
.
Poniższy kod podkreśla różnicę między ===
i 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
Więcej przykładów znajdziesz tutaj .
Uwaga : Object.is
jest częścią propozycji ECMAScript 6 i nie jest jeszcze szeroko obsługiwany (np. Nie jest obsługiwany przez żadną wersję Internet Explorera lub wiele starszych wersji innych przeglądarek). Możesz jednak użyć wypełniacza dla przeglądarek innych niż ES6, który można znaleźć w linku podanym powyżej.
.x
na łańcuchu umieszcza go wString
obiekcie (a nie w wartości pierwotnej ciągu), a porównanie byłoby między obiektem a ciągiem - to jest bardzo subtelne i jest pułapką - statystyka pozwala uniknąć tych problemów, metody statyczne są prostsze i łatwiejsze w użyciu.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
używa algorytmu SameValue specyfikacji , podczas gdy===
używa algorytmu Strict Equality Algorithm . Uwaga na temat algorytmu ścisłej równości zwraca uwagę na różnicę:Zauważ, że:
NaN === NaN
jest fałszywe, aleObject.is(NaN, NaN)
jest prawdziwe+0 === -0
jest prawdziwe, aleObject.is(+0, -0)
jest fałszywe-0 === +0
jest prawdziwe, aleObject.is(-0, +0)
jest fałszyweJavaScript ma co najmniej cztery rodzaje „równości”:
==
), gdzie operandy zostaną wymuszone, aby spróbować je dopasować. Zasady są jasno określone , ale nieoczywiste. ("" == 0
jesttrue
;"true" == true
jestfalse
, ...).===
), gdzie operandy różnych typów nie będą wymuszane (i nie będą równe), ale zobacz uwagę powyżejNaN
oraz dodatnie i ujemne zero.Object.is
).SameValue
z wyjątkiem+0
i-0
są takie same zamiast różnych (używane przezMap
dla kluczy i przezArray.prototype.includes
).Istnieje również równoważność obiektów , która nie jest zapewniana przez sam język lub środowisko wykonawcze, ale jest zwykle wyrażana jako: Obiekty mają ten sam prototyp, te same właściwości, a ich wartości właściwości są takie same (według rozsądnej definicji „takie same” ).
Algorytm SameValue :
... gdzie SameValueNonNumber to:
Algorytm ścisłej równości :
źródło
Powyżej jest funkcją polyfill, która pokazuje, jak
Object.is
działa, dla każdego, kto jest zainteresowany. Odniesienie do You-Don't-Know-JSźródło
Podsumowanie:
Object.is()
Funkcja przyjmuje wartości 2 jako argumenty i zwraca true, jeśli 2 Podane wartości są dokładne takie same, w przeciwnym razie będzie to return false.Dlaczego tego potrzebujemy?
Możesz pomyśleć, że mamy już ścisłą równość (sprawdza typ + wartość) sprawdzanie w javascript z
===
operatorem, po co nam ta funkcja? Cóż, ścisła równość nie jest wystarczająca w niektórych przypadkach i są one następujące:Object.is()
pomaga nam, ponieważ jest w stanie porównać te wartości, aby zobaczyć, czy są podobne, czego operator ścisłej równości nie może zrobić.źródło
Krótko mówiąc, są podobne, ale
Object.is
są mądrzejsze i dokładniejsze ...Spójrzmy na to ...
Ale to nie jest w pełni słuszne, ponieważ ignoruje
-
i+
przed ...Teraz używamy:
Jak widać, porównanie jest dokładniejsze.
Również w tym przypadku
NaN
działa bardziej jak poprawne, rozważNaN
to samo.źródło