Operatorii de comparare - javascript, mdn

  • egalitate ( „egală cu dublă“) utilizează ==
  • egalitate strictă (sau „bine triplu“ sau „identic“) folosește ===
  • și Object.is (inovare ECMAScript 6).

Selectarea operatorului depinde de tipul de comparație care urmează să fie produsă.

În termeni generali, cu dublă egal înainte de valori comparative produce o distributie; triplă compară valoare egală fără reducere (în cazul în care cantitățile de tipuri diferite, nu return false compararea.); Object.is bine și se comportă ca un bine triplu, dar cu o manipulare specială pentru NaN. 0 și 0. revenind fals în comparație cu 0 și -0. și adevărat pentru operare Object.is (NaN, NaN). (În timp ce o întoarcere egalitate dublă sau triplă fals în conformitate cu standardul IEEE 754.) Trebuie remarcat faptul că toate aceste diferențe în comparațiile sunt valabile numai pentru primitivelor. Pentru orice non-primitiv obiecte x și y. care au aceeași structură, dar sunt două obiecte separate (variabile x și y nu se referă la același obiect), toți operatorii relationale return false.

Comparație folosind ==

Înainte de a compara operatorul de egalitate acționează ambele valori la un tip comun. După reducere (una sau ambele operanzilor), comparația finală se realizează precum și pentru ===. Operația de comparație este simetrică. A == B returnează aceeași valoare ca și B == A pentru toate valorile A și B.

Următorul tabel rezumă rezultatele comparării operatorului de egalitate pentru valori diferite:

În tabelul de mai sus, ToNumber (A) încearcă înainte de comparația duce la numărul de argumentul său. Acest comportament este echivalent cu + A (unar +). Dacă ToPrimitive (A) primește obiect ca argument, încercările sunt făcute să-l aducă la primitiv, determinându-l și metodele A.toString A.valueOf.

În mod tradițional, (și în conformitate cu ECMAScript). nici unul dintre obiectele care nu este nedefinit sau nul. Dar cele mai multe browsere permit o anumită clasă de obiecte (de exemplu, obiecte document.all pentru orice pagină) pentru a emula valoarea nedefinită. Operatorul de egalitate returnează true pentru null == A și nedefinită == A. Atunci, și numai atunci, atunci când obiectul emulează valoarea nedefinită. În toate celelalte cazuri, obiectul nu poate fi egal cu nedefinită sau nul.

Unii dezvoltatori cred că este întotdeauna mai bine să se utilizeze operatorul strict de egalitate, în loc de a compara cu conversie de tip. Rezultat egalitate strictă mai ușor de prezis, și comparând valorile, fără a le aduce pot primi câștiguri de viteză.

egalitate strictă cu ===

controale egale stricte pentru egalitate două cantități, cantitățile fiecărui tip înainte de comparația nu este modificată (nu este prezentat). În cazul în care valorile sunt de diferite tipuri, ele nu pot fi egale. Pe de altă parte, nu toate variabilele numerice care aparțin aceluiași tip, considerate egale între ele, în cazul în care conțin aceleași valori. Și, în sfârșit, variabilele numerice sunt egale dacă au aceeași valoare, sau una din partea de jos a +0. iar a doua -0. În același timp, în cazul în care cel puțin una dintre variabila numerică conține valoarea NaN. expresie returnează false.

Aproape întotdeauna să fie folosit pentru a compara operatorul strict de egalitate. Pentru toate setările, cu excepția semantica evidente utilizate numeric: valoarea este egală doar pentru sine. După cum sa menționat mai sus, două cazuri speciale pot fi deosebite pentru tipurile numerice. În primul rând, comparând 0 și -0. Conectați-vă pentru zero, pentru a simplifica unele calcule în virgulă mobilă, cu toate acestea, din punct de vedere al matematicii, iar diferența dintre -0 0 nu există, prin urmare, operatorul de egalitate strictă consideră acestea să fie egal. În al doilea rând, compararea valorilor NaN. NaN (Nu este un număr) reprezintă valoarea nu este o anumită valoare, care este utilizat pentru probleme matematice nu sunt clar definite (de exemplu, + ∞ + -∞). Pentru operatorul strict egal NaN nu este egal cu nici o valoare, inclusiv în sine (singurul caz în care (x! == x) returnează true).

cantități egale de aceeași

Aceleași valori de egalitate definește funcțional identic în toate contextele valori comparate. (Această metodă se bazează pe compararea principiului substituției Barbara Liskov.) Să considerăm următorul exemplu încercările de a modifica proprietățile invariabile (invariabile).

Când încercați să modificați proprietăți imuabile, suna Object.defineProperty arunca o excepție, cu toate acestea, în cazul în care noua proprietate este egal cu vechiul mod, schimbarea nu se va întâmpla și nu este o excepție va fi aruncată. Dacă v conține 0. schimbările nu va avea loc, ceea ce înseamnă că codul va funcționa fără excepții de eliberare. Cu toate acestea, în cazul în care v conține 0. Number.NEGATIVE_ZERO pierde valoarea invariabilă. Este pentru a compara noile curente ale proprietăților și imuabile utilizate cantități identice de comparație reprezentate de Object.is.

Specificații pentru egalitatea, egalitatea strictă, și egalitatea de aceeași magnitudine

In standardul ES5, comparația realizată de operatorul == descris în secțiunea 11.9.3, The Abstract Egalitatea Algorithm. Descriere === Operatorul este prevăzut în secțiunea 11.9.6, strict egalitatea de algoritm. În secțiunea 9.12, The SameValue Algoritmul ES5 descrie funcționarea comparației acelorași cantități pentru JS intern al motorului. egalitate strictă și egalitatea de valori identice sunt aproape identice, cu excepția tipurilor numerice de prelucrare. ES6 sugerează utilizarea unui algoritm de comparare cantități identice prin apelarea Object.is.

Cum să înțeleagă toate aceste metode de comparație?

Tabel comparativ al operatorilor de comparare

Atunci când este utilizat Object.is?

Object.is zerouri de prelucrare caracteristică va fi utilă în meta-programare, atunci când este necesar să se atribuie o valoare proprietății de Object.defineProperty mâner opus. În cazul în care sarcinile nu nevoie de ea, este mai bine să se abțină de la utilizarea Object.is. === optând. Chiar dacă codul de care aveți nevoie pentru a compara două NaN. de obicei, cel mai simplu mod de a utiliza metoda existentă isNaN. calculelor ulterioare nu afectează compararea zerouri cu caractere diferite.

Iată câteva exemple de operatori și metode care pot face diferența între 0 și 0 mai explicit, care va fi cu siguranță reflectate în codul:

Este evident că utilizarea minus unar la zero va -0. Dar, uneori, este complet invizibil. De exemplu:

Dacă valoarea obj.velocity este 0, atunci rezultatul este -0 expresie. care în cele din urmă se va reflecta în stoppingForce variabilă.

Math.atan2 Math.ceil Math.pow Math.round Este posibil ca aceste metode pot returna 0. chiar dacă nu este trecut în mod explicit unul dintre parametrii. De exemplu, în cazul în care metoda Math.pow erecta -Infinity în orice măsură negativ. Consultați descrierea detaliată a acestor metode. Math.floor Math.max Math.min Math.sin Math.sqrt Math.tan În unele cazuri, puteți obține rezultatul este -0. În cazul în care metodele de mai sus de unul dintre parametrii pentru a trece -0. De exemplu, Math.min (-0, 0) returnează -0. Consultați descrierea detaliată a acestor metode.

<<>> Fiecare dintre acești operatori utilizează un algoritm ToInt32 intern. În ea nu există nici un loc pentru zero, negativ, deoarece valoarea -0 nu supraviețui o astfel de operațiune. Asta este, Object.is (

(-0) -0). și Object.is (-0 <<2>> 2 -0) se va întoarce false.

Din cele de mai sus, este clar că utilizarea Object.is poate fi uneori problematică. Desigur, dacă trebuie să facă o distincție clară între 0 și 0. această metodă este exact ceea ce ai nevoie.

A se vedea, de asemenea,