Care operator egal (== vs ===) ar trebui utilizat în comparațiile JavaScript?

Folosesc JSLint pentru a parcurge JavaScript și returnează multe sugestii pentru a înlocui == (două egale semne) cu === (trei semne egale) atunci când faci lucruri precum compararea idSele_UNVEHtype.value.length == 0 în interiorul unei declarații if.

Există un avantaj de performanță în înlocuirea lui == cu ===?

Orice îmbunătățire a performanței ar fi binevenită deoarece există mulți operatori de comparație.

Dacă nu are loc nicio conversie de tip, ar exista un câștig de performanță peste ==?


person bcasp    schedule 11.12.2008    source sursă


Răspunsuri (48)


Operatorul de egalitate strictă (===) se comportă identic cu operatorul de egalitate abstract (==), cu excepția faptului că nu se face nicio conversie de tip, iar tipurile trebuie să fie aceleași pentru a fi considerate egale.

Referință: Tutorial Javascript: Operatori de comparație

Operatorul == va compara pentru egalitate după ce face orice conversie de tip necesară. Operatorul === nu va efectua conversia, deci, dacă două valori nu sunt de același tip, === va returna pur și simplu false. Ambele sunt la fel de rapide.

Pentru a cita excelentul JavaScript: The Good Parts al lui Douglas Crockford,

JavaScript are două seturi de operatori de egalitate: === și !== și gemenii lor malefici == și !=. Cei buni funcționează așa cum v-ați aștepta. Dacă cei doi operanzi sunt de același tip și au aceeași valoare, atunci === produce true și !== produce false. Gemenii răi fac ceea ce trebuie atunci când operanzii sunt de același tip, dar dacă sunt de tipuri diferite, încearcă să constrângă valorile. regulile după care fac acestea sunt complicate și de nememorat. Acestea sunt câteva dintre cazurile interesante:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

„Tabel

Lipsa tranzitivității este alarmantă. Sfatul meu este să nu folosiți niciodată gemenii răi. În schimb, folosiți întotdeauna === și !==. Toate comparațiile tocmai arătate produc false cu operatorul ===.


Actualizați:

Un punct bun a fost adus în discuție de @Casebash în comentarii și în @Phillipe Laybaert răspunsul referitor la obiecte. Pentru obiecte, == și === acționează în mod consecvent unul cu celălalt (cu excepția unui caz special).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

Cazul special este atunci când comparați o primitivă cu un obiect care evaluează la aceeași primitivă, datorită metodei sale toString sau valueOf. De exemplu, luați în considerare compararea unei primitive șir cu un obiect șir creat folosind constructorul String.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

Aici operatorul == verifică valorile celor două obiecte și returnează true, dar === vede că nu sunt de același tip și returnează false. Care este corect? Asta chiar depinde de ceea ce încerci să compari. Sfatul meu este să ocoliți complet întrebarea și pur și simplu să nu folosiți constructorul String pentru a crea obiecte șir din literale șir.

Referință
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

person Bill the Lizard    schedule 11.12.2008
comment
De asemenea, aș sublinia că 0 === -0 și NaN !== NaN, ceea ce poate fi confuz uneori. Dacă doriți să diferențiați ±0 și să considerați NaN egal, utilizați Object.is (ES2015) - person Ovinus Real; 11.10.2020
comment
Tastarea soft este o funcție. Evident, Crockford subliniază unele dintre artefactele deciziei de proiectare, dar tastarea soft este încă o caracteristică. Dacă este folosit corect, este absolut bine. Nu aruncați copilul împreună cu apa din baie. - person aross; 25.03.2021

Folosind operatorul == (Egalitatea)

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

Folosind operatorul === (Identitate)

true === 1; //false
"2" === 2;  //false

Acest lucru se datorează faptului că operatorul de egalitate == tip coerciție, ceea ce înseamnă că interpretul încearcă implicit să convertească valorile înainte de a compara.

Pe de altă parte, operatorul de identitate === nu face coerciție de tip și, prin urmare, nu convertește valorile la comparare și, prin urmare, este mai rapid (așa cum se arată în Acest test de referință JS), deoarece omite un pas.

person Community    schedule 11.12.2008

O reprezentare picturală interesantă a comparației de egalitate între == și ===.

Sursa: http://dorey.github.io/JavaScript-Equality-Table/


var1 === var2

Când utilizați === pentru testarea egalității JavaScript, totul este așa cum este. Nimic nu este convertit înainte de a fi evaluat.

Evaluarea egalității === în JS


var1 == var2

Când utilizați == pentru testarea egalității JavaScript, au loc unele conversii ciudate.

Evaluarea egalității == în JS


Concluzie:

Folosiți întotdeauna ===.

(Dacă nu înțelegeți pe deplin conversiile care au loc cu ==.)

person SNag    schedule 05.05.2014
comment
Un tabel „==” mai bun: algassert.com/ vizualizare/2014/03/27/ - person rocketsarefast; 24.05.2021

În răspunsurile de aici, nu am citit nimic despre ce înseamnă egal. Unii vor spune că === înseamnă egal și de același tip, dar nu este chiar adevărat. De fapt înseamnă că ambele operanzi fac referire la același obiect sau, în cazul tipurilor de valori, au aceeași valoare.

Deci, să luăm următorul cod:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

La fel aici:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Sau chiar:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Acest comportament nu este întotdeauna evident. Există mai mult în poveste decât a fi egal și a fi de același tip.

Regula este:

Pentru tipurile de valori (numere):
a === b returnează adevărat dacă a și b au aceeași valoare și sunt de același tip

Pentru tipurile de referință:
a === b returnează adevărat dacă a și b fac referire exact la același obiect

Pentru șiruri:
a === b returnează adevărat dacă a și b sunt ambele șiruri și conțin exact aceleași caractere


Corzi: cazul special...

Șirurile nu sunt tipuri de valoare, dar în Javascript se comportă ca tipuri de valoare, deci vor fi egale atunci când caracterele din șir sunt aceleași și când au aceeași lungime (după cum este explicat în a treia regulă)

Acum devine interesant:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

Dar ce zici de asta?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Am crezut că șirurile se comportă ca tipuri de valori? Ei bine, depinde pe cine întrebi... În acest caz a și b nu sunt de același tip. a este de tip Object, în timp ce b este de tip string. Nu uitați doar că crearea unui obiect șir folosind constructorul String creează ceva de tip Object care se comportă ca un șir de cele mai multe ori.

person Philippe Leybaert    schedule 05.06.2009

Permiteți-mi să adaug acest sfat:

Dacă aveți îndoieli, citiți specificația !

ECMA-262 este specificația pentru un limbaj de scripting din care JavaScript este un dialect. Desigur, în practică contează mai mult modul în care se comportă cele mai importante browsere decât o definiție ezoterică a modului în care ar trebui să fie tratat ceva. Dar este util să înțelegeți de ce noul String(a) !== a.

Vă rog să vă explic cum să citesc specificația pentru a clarifica această întrebare. Văd că în acest subiect foarte vechi nimeni nu a avut un răspuns pentru efectul foarte ciudat. Deci, dacă poți citi o specificație, aceasta te va ajuta enorm în profesia ta. Este o abilitate dobândită. Deci, hai să continuăm.

Căutarea === în fișierul PDF mă duce la pagina 56 a specificației: 11.9.4. Operatorul Strict Equals ( === )și, după ce am parcurs specificațiile, găsesc:

11.9.6 Algoritmul strict de comparare a egalității
Comparația x === y, unde x și y sunt valori, produce adevărat sau fals >. O astfel de comparație se efectuează după cum urmează:
  1. Dacă Tipul(x) este diferit de Tipul(y), returnați fals.
  2. Dacă Tipul(x) este Nedefinit, returnați adevărat.
  3. Dacă Tipul(x) este Null, returnați adevărat.
  4. Dacă Tipul(x) nu este Număr, treceți la pasul 11 .
  5. Dacă x este NaN, returnați fals.
  6. Dacă y este NaN, returnați false .
  7. Dacă x este aceeași valoare numerică cu y, returnează adevărat.
  8. Dacă x este +0 și y este −0, returnează adevărat.
  9. Dacă x este −0 și y este +0, returnează adevărat.
  10. Returnează fals.
11. Dacă Type(x) este String, atunci returnează true dacă x și y sunt exact aceeași secvență de caractere (aceeași lungime și aceleași caractere în pozițiile corespunzătoare); în caz contrar, returnați fals.
  12. Dacă Tipul(x) este boolean, returnați adevărat dacă x și y sunt ambele adevărate sau ambele fals; în caz contrar, returnați fals.
  13. Returnați adevărat dacă x și y se referă la același obiect sau dacă se referă la obiecte unite între ele (vezi 13.1.2 ). În caz contrar, returnați false.

Interesant este pasul 11. Da, șirurile sunt tratate ca tipuri de valori. Dar acest lucru nu explică de ce noul String(a) !== a. Avem un browser care nu este conform cu ECMA-262?

Nu asa de repede!

Să verificăm tipurile de operanzi. Încercați-l singur, împachetându-le în typeof(). Găsesc că new String(a) este un obiect și se folosește pasul 1: returnează false dacă tipurile sunt diferite.

Dacă vă întrebați de ce new String(a) nu returnează un șir, ce zici de un exercițiu de citire a unei specificații? A se distra!


Aidiakapi a scris asta într-un comentariu de mai jos:

Din caietul de sarcini

11.2.2 Noul operator:

Dacă Type(constructor) nu este Object, aruncați o excepție TypeError.

Cu alte cuvinte, dacă String nu ar fi de tip Object, nu ar putea fi folosit cu noul operator.

new returnează întotdeauna un Object, chiar și pentru constructorii String. Și vai! Semantica valorii pentru șiruri (vezi pasul 11) este pierdută.

Și asta înseamnă în cele din urmă: New String(a) !== a.

person nalply    schedule 28.11.2009

Am testat acest lucru în Firefox cu Firebug folosind cod ca acesta:

console.time("testEquality");
var n = 0;
while (true) {
  n++;
  if (n == 100000)
    break;
}
console.timeEnd("testEquality");

și

console.time("testTypeEquality");
var n = 0;
while (true) {
  n++;
  if (n === 100000)
    break;
}
console.timeEnd("testTypeEquality");

Rezultatele mele (testate de cinci ori fiecare și mediate):

==: 115.2
===: 114.4

Deci, aș spune că diferența minusculă (aceasta este de peste 100.000 de iterații, amintiți-vă) este neglijabilă. Performanța nu este un motiv pentru a face ===. Tastați siguranță (ei bine, pe cât de sigur veți obține în JavaScript), iar calitatea codului este.

person Simon Scarfe    schedule 25.12.2008
comment
Acum, cum se compară acestea când există o constrângere de tip reală pentru operatorul ==? Amintiți-vă, atunci există o creștere a performanței. - person Hubert OG; 14.07.2013
comment
Diferență MAJORĂ atunci când este testată corespunzător din motivele menționate mai sus de a verifica mai rapid doar inegalitatea de tip. jsfiddle.net/4jhuxkb2 - person Doug Morrow; 06.07.2015

În PHP și JavaScript, este un operator de egalitate strict. Ceea ce înseamnă că va compara atât tipul, cât și valorile.

person Shiki    schedule 12.05.2010

În JavaScript înseamnă aceeași valoare și tip.

De exemplu,

4 == "4" // will return true

dar

4 === "4" // will return false 
person Dimitar    schedule 12.05.2010

Operatorul === este numit operator de comparație strictă, difer de operatorul ==.

Să luăm 2 vars a și b.

Pentru ca „a == b” să se evalueze la a și b adevărat trebuie să fie aceeași valoare.

În cazul „a === b” a și b trebuie să fie aceeași valoare și, de asemenea, același tip pentru ca acesta să fie evaluat la Adevărat.

Luați următorul exemplu

var a = 1;
var b = "1";

if (a == b) //evaluates to true as a and b are both 1
{
    alert("a == b");
}

if (a === b) //evaluates to false as a is not the same type as b
{
    alert("a === b");
}

În rezumat; utilizarea operatorului == ar putea fi evaluată drept adevărat în situațiile în care nu doriți, astfel încât utilizarea operatorului === ar fi mai sigură.

În scenariul de utilizare de 90%, nu va conta pe care îl folosiți, dar este la îndemână să știți diferența atunci când aveți un comportament neașteptat într-o zi.

person Doctor Jones    schedule 11.12.2008

De ce == este atât de imprevizibil?

Ce obții când compari un șir gol "" cu numărul zero 0?

true

Da, așa este conform == un șir gol și numărul zero sunt același timp.

Și nu se termină aici, iată încă una:

'0' == false // true

Lucrurile devin foarte ciudate cu matrice.

[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true

Apoi mai ciudat cu șiruri

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

Devine mai rău:

Când este egal nu este egal?

let A = ''  // empty string
let B = 0   // zero
let C = '0' // zero string

A == B // true - ok... 
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!

Lasă-mă să spun asta din nou:

(A == B) && (B == C) // true
(A == C) // **FALSE**

Și acestea sunt doar chestiile nebunești pe care le primești cu primitivii.

Este un nivel cu totul nou de nebunie când folosești == cu obiecte.

În acest moment, probabil vă întrebați...

De ce se întâmplă acest lucru?

Ei bine, pentru că, spre deosebire de „triplu egal” (===), care doar verifică dacă două valori sunt aceleași.

== face multe alte chestii.

Are o manipulare specială pentru funcții, o gestionare specială pentru valorile nule, nedefinite, șiruri de caractere, cum ar fi.

Devine destul de ciudat.

De fapt, dacă ați încerca să scrieți o funcție care face ceea ce face ==, ar arăta cam așa:

function isEqual(x, y) { // if `==` were a function
    if(typeof y === typeof x) return y === x;
    // treat null and undefined the same
    var xIsNothing = (y === undefined) || (y === null);
    var yIsNothing = (x === undefined) || (x === null);

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);

    if(typeof y === "function" || typeof x === "function") {
        // if either value is a string 
        // convert the function into a string and compare
        if(typeof x === "string") {
            return x === y.toString();
        } else if(typeof y === "string") {
            return x.toString() === y;
        } 
        return false;
    }

    if(typeof x === "object") x = toPrimitive(x);
    if(typeof y === "object") y = toPrimitive(y);
    if(typeof y === typeof x) return y === x;

    // convert x and y into numbers if they are not already use the "+" trick
    if(typeof x !== "number") x = +x;
    if(typeof y !== "number") y = +y;
    // actually the real `==` is even more complicated than this, especially in ES6
    return x === y;
}

function toPrimitive(obj) {
    var value = obj.valueOf();
    if(obj !== value) return value;
    return obj.toString();
}

Deci, ce înseamnă asta?

Înseamnă că == este complicat.

Pentru că este complicat, este greu să știi ce se va întâmpla când îl vei folosi.

Ceea ce înseamnă că ai putea ajunge cu bug-uri.

Deci morala poveștii este...

Faceți-vă viața mai puțin complicată.

Folosiți === în loc de ==.

Sfârșitul.

person Luis Perez    schedule 09.08.2016

=== verifică că aceleași părți sunt egale în tip, precum și în valoare.


Exemplu:

'1' === 1 // will return "false" because `string` is not a `number`

Exemplu comun:

0 == ''  // will be "true", but it's very common to want this check to be "false"

Un alt exemplu comun:

null == undefined // returns "true", but in most cases a distinction is necessary

De multe ori o verificare netipată ar fi utilă, deoarece nu vă pasă dacă valoarea este fie undefined, null, 0 sau ""

person vsync    schedule 12.05.2010

Diagrama fluxului de execuție Javascript pentru egalitate strictă / Comparație '==='

Egalitate strictă Javascript

Diagrama fluxului de execuție Javascript pentru egalitate/comparație non strictă „==”

Javascript non-equality

person Samar Panda    schedule 05.09.2015

JavaScript === vs == .

0==false   // true
0===false  // false, because they are of a different type
1=="1"     // true, auto type coercion
1==="1"    // false, because they are of a different type
person Community    schedule 03.07.2013

Înseamnă constrângere de tip egalitate fără constrângere de tip înseamnă că JavaScript nu convertește automat alte tipuri de date în tipuri de date șir

0==false   // true,although they are different types

0===false  // false,as they are different types

2=='2'    //true,different types,one is string and another is integer but 
            javaScript convert 2 to string by using == operator 

2==='2'  //false because by using === operator ,javaScript do not convert 
           integer to string 

2===2   //true because both have same value and same types 
person Pop Catalin    schedule 12.05.2010

Într-un script tipic nu va exista nicio diferență de performanță. Mai important poate fi faptul că o mie de „===" este cu 1 KB mai greu decât o mie de „==" :) Profileri JavaScript vă poate spune dacă există o diferență de performanță în cazul dvs.

Dar personal aș face ceea ce sugerează JSLint. Această recomandare există nu din cauza problemelor de performanță, ci pentru că tipul de constrângere înseamnă că ('\t\r\n' == 0) este adevărat.

person Constantin    schedule 16.12.2008

Operatorul de comparație egală == este confuz și ar trebui evitat.

Dacă TREBUIE să trăiți cu ea, atunci amintiți-vă următoarele 3 lucruri:

  1. Nu este tranzitiv: (a == b) și (b == c) nu duc la (a == c)
  2. Se exclud reciproc negației sale: (a == b) și (a != b) au întotdeauna valori booleene opuse, cu toate a și b.< /strong>
  3. În caz de îndoială, aflați pe de rost următorul tabel de adevăr:

TABEL DE adevăr al operatorului egal în JAVASCRIPT

  • Fiecare rând din tabel este un set de 3 valori reciproc „egale”, ceea ce înseamnă că oricare 2 valori dintre ele sunt egale folosind semnul egal ==*

** CIUDAT: rețineți că oricare două valori de pe prima coloană nu sunt egale în acest sens.**

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.
person CuongHuyTo    schedule 16.09.2011

Este puțin probabil să existe vreo diferență de performanță între cele două operațiuni în utilizarea dvs. Nu trebuie făcută nicio conversie de tip, deoarece ambii parametri sunt deja de același tip. Ambele operațiuni vor avea o comparație de tip urmată de o comparație de valori.

person Sean    schedule 11.12.2008

Da! Contează.

Operatorul === în javascript verifică valoarea, precum și tipul, în timp ce operatorul == verifică doar valoarea (face conversia tipului, dacă este necesar).

introduceți descrierea imaginii aici

Îl poți testa cu ușurință. Lipiți următorul cod într-un fișier HTML și deschideți-l în browser

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

Veți primi „fals” în alertă. Acum modificați metoda onPageLoad() la alert(x == 5);, veți obține adevărat.

person Aniket Thakur    schedule 14.11.2014

Operatorul === verifică valorile precum și tipurile de variabile pentru egalitate.

Operatorul == verifică doar valoarea variabilelor pentru egalitate.

person Niraj CHoubey    schedule 12.05.2010

Pur şi simplu

== înseamnă comparație între operanzi cu tip coerciție

și

=== înseamnă comparație între operanzi fără constrângere de tip.

Coerciția de tip în JavaScript înseamnă conversia automată a tipurilor de date în alte tipuri de date.

De exemplu:

123 == "123"  // Returns true, because JS coerces string "123" to number 123
              // and then goes on to compare `123 == 123`.

123 === "123" // Returns false, because JS does not coerce values of different types here.
person Amit    schedule 20.03.2015

Este un test de verificare strict.

Este un lucru bun, mai ales dacă verificați între 0 și false și null.

De exemplu, dacă aveți:

$a = 0;

Apoi:

$a==0; 
$a==NULL;
$a==false;

Toate revin adevărate și este posibil să nu doriți acest lucru. Să presupunem că aveți o funcție care poate returna indicele 0 al unui tablou sau false la eșec. Dacă verificați cu „==" false, puteți obține un rezultat confuz.

Deci, cu același lucru ca mai sus, dar un test strict:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false
person Daniel    schedule 12.05.2010
comment
În JavaScript, acest lucru este complet greșit și greșit incomplet. 0 != null. -1 - person Ry-♦; 06.05.2013

JSLint vă oferă uneori motive nerealiste pentru a modifica lucrurile. === are exact aceeași performanță ca și == dacă tipurile sunt deja aceleași.

Este mai rapid doar atunci când tipurile nu sunt aceleași, caz în care nu încearcă să convertească tipuri, ci returnează direct un false.

Deci, IMHO, JSLint poate fi folosit pentru a scrie cod nou, dar supraoptimizarea inutilă ar trebui evitată cu orice preț.

Adică, nu există niciun motiv să schimbi == cu === într-o verificare ca if (a == 'test') când știi că a poate fi doar un șir.

Modificarea multor coduri în acest fel pierde timpul dezvoltatorilor și recenzenților și nu obține nimic.

person ashes    schedule 05.06.2012
comment
Interesant, a.length===4 este de fapt mai lent în Firefox decât a.length==4. Este, oricum, o micro-optimizare, dar aceasta este contrar a ceea ce susțin oamenii. - person aross; 25.03.2021

Ca regulă generală, aș folosi în general === în loc de == (și !== în loc de !=).

Motivele sunt explicate în răspunsurile de mai sus și, de asemenea, Douglas Crockford este destul de clar în acest sens (JavaScript: părțile bune).

Cu toate acestea, există o singură excepție: == null este o modalitate eficientă de a verifica dacă „este nul sau nedefinit”:

if( value == null ){
    // value is either null or undefined
}

De exemplu, jQuery 1.9.1 utilizează acest model de 43 de ori, iar Verificatorul de sintaxă JSHint chiar oferă opțiunea eqnull relaxantă din acest motiv.

Din ghidul de stil jQuery:

Ar trebui utilizate controale stricte de egalitate (===) în favoarea ==. Singura excepție este atunci când se verifică undefined și null prin intermediul null.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

EDIT 2021-03:

În prezent, majoritatea browserelor acceptă Operatorul de coalescere Nullish (??) și Atribuire nulă logică (??=), care permite un mod mai concis de a atribui o valoare implicită dacă o variabilă este nulă sau nedefinită, pt. exemplu:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

poate fi scris ca oricare dintre aceste forme

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
person mar10    schedule 27.04.2013
comment
== null este o modalitate eficientă de a verifica dacă „este null sau undefined””sau document.all. - person Sebastian Simon; 15.03.2021

Un exemplu simplu este

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.
person Vikas    schedule 14.05.2015

Primele 2 răspunsuri menționate == înseamnă egalitate și === înseamnă identitate. Din păcate, această afirmație este incorectă.

Dacă ambii operanzi ai == sunt obiecte, atunci ei sunt comparați pentru a vedea dacă sunt același obiect. Dacă ambii operanzi indică același obiect, atunci operatorul egal returnează adevărat. Altfel, cei doi nu sunt egali.

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

În codul de mai sus, atât == cât și === devin false, deoarece a și b nu sunt aceleași obiecte.

Adică: dacă ambii operanzi ai == sunt obiecte, == se comportă la fel ca ===, ceea ce înseamnă și identitate. Diferența esențială a acestor doi operatori este conversia tipului. == are conversie înainte de a verifica egalitatea, dar === nu.

person Harry He    schedule 09.09.2013

Problema este că s-ar putea să ai cu ușurință probleme, deoarece JavaScript are o mulțime de conversii implicite, ceea ce înseamnă...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

Ceea ce destul de curând devine o problemă. Cel mai bun exemplu de motiv pentru care conversia implicită este „rău” poate fi luat din acest cod în MFC / C++ care de fapt se va compila datorită unei conversii implicite de la CString la HANDLE, care este un tip tip tip pointer...

CString x;
delete x;

Care, evident, în timpul rulării face lucruri foarte nedefinite...

Google pentru conversii implicite în C++ și STL pentru a obține câteva dintre argumentele împotriva...

person Thomas Hansen    schedule 29.12.2008
comment
0 == null este fals. - person Garrett; 13.01.2014

Din referință javascript de bază

=== Returnează true dacă operanzii sunt strict egali (vezi mai sus) fără conversie de tip.

person Paul Butcher    schedule 12.05.2010

Comparație de egalitate:

operator ==

Returnează adevărat, când ambii operanzi sunt egali. Operanzii sunt convertiți în același tip înainte de a fi comparați.

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

Egalitatea și comparația tipului:

operator ===

Returnează adevărat dacă ambii operanzi sunt egali și de același tip. În general, este mai bine și mai sigur dacă comparați astfel, deoarece nu există conversii de tip în spatele scenei.

>>> 1 === '1'
false
>>> 1 === 1
true
person user2601995    schedule 02.10.2013

Iată un tabel de comparație la îndemână care arată conversiile care au loc și diferențele dintre == și ===.

După cum arată concluzia:

„Folosiți trei egali, dacă nu înțelegeți pe deplin conversiile care au loc pentru doi egali.”

http://dorey.github.io/JavaScript-Equality-Table/

person Christian Hagelid    schedule 27.03.2014

nule și nedefinite sunt neantul, adică

var a;
var b = null;

Aici a și b nu au valori. În timp ce, 0, false și „” sunt toate valori. Un lucru comun între toate acestea este că toate sunt valori false, ceea ce înseamnă că toate satisfac condiții false.

Deci, 0, fals și '' formează împreună un subgrup. Și pe de altă parte, nul și nedefinit formează al doilea subgrup. Verificați comparațiile din imaginea de mai jos. nul și nedefinit ar fi egal. Celelalte trei ar fi egale între ele. Dar, toate sunt tratate ca condiții false în JavaScript.

Introduceți descrierea imaginii aici

Acest lucru este la fel ca orice obiect (cum ar fi {}, matrice etc.), șirul nevid și booleanul adevărat sunt toate condiții de adevăr. Dar, nu toate sunt egale.

person Community    schedule 14.04.2014

*Operatori === vs == *

1 == true    =>    true
true == true    =>    true
1 === true    =>    false
true === true    =>    true
person Mr.G    schedule 19.03.2014

JavaScript are atât comparații stricte, cât și comparații de conversie a tipurilor. O comparație strictă (de exemplu, ===) este adevărată numai dacă operanzii sunt de același tip. Comparația abstractă folosită mai des (de exemplu, ==) convertește operanzii la același tip înainte de a face comparația.

  • Operatorul de egalitate (==) convertește operanzii dacă nu sunt de același tip, apoi aplică o comparație strictă. Dacă oricare operand este un număr sau un boolean, operanzii sunt convertiți în numere dacă este posibil; altfel, dacă oricare operand este un șir, operandul șir este convertit într-un număr dacă este posibil. Dacă ambii operanzi sunt obiecte, atunci JavaScript compară referințele interne care sunt egale atunci când operanzii se referă la același obiect din memorie.

    Sintaxă:

    x == y

    Exemple:

    3 == 3     // true
    "3" == 3   // true
    3 == '3'   // true
    
  • Operatorul identity/strict equality(===) returnează adevărat dacă operanzii sunt strict egali (vezi mai sus) fără conversie de tip.

    Sintaxă:

    x === y

    Exemple:

    3 === 3 // true

Pentru referință: Operatori de comparație< /em> (Mozilla Developer Network)

person garakchy    schedule 08.08.2014

Dacă creați o aplicație web sau o pagină securizată, ar trebui să utilizați întotdeauna (doar când este posibil)

===

pentru că va verifica dacă este același conținut și dacă este același tip!

deci cand intra cineva:

var check = 1;
if(check == '1') {
    //someone continued with a string instead of number, most of the time useless for your webapp, most of the time entered by a user who does not now what he is doing (this will sometimes let your app crash), or even worse it is a hacker searching for weaknesses in your webapp!
}

dar cu

var check = 1;
if(check === 1) {
    //some continued with a number (no string) for your script
} else {
    alert('please enter a real number');
}

un hacker nu va pătrunde niciodată mai adânc în sistem pentru a găsi erori și a sparge aplicația sau utilizatorii dvs

ideea mea este că

===

va adăuga mai multă securitate scripturilor dvs

bineînțeles că puteți verifica și dacă numărul introdus este valid, este un șir, etc. cu alte afirmații if în primul exemplu, dar acest lucru este cel puțin pentru mine mai ușor de înțeles și de folosit

Motivul pentru care am postat acest lucru este că cuvântul „mai sigur” sau „securitate” nu a fost niciodată spus în această conversație (dacă te uiți la iCloud.com, folosește de 2019 ori === și de 1308 de ori ==, asta înseamnă, de asemenea, că uneori folosiți == în loc de ===, deoarece altfel vă va bloca funcția, dar așa cum s-a spus la început, ar trebui să utilizați === cât mai mult posibil)

person Sake Salverda    schedule 28.11.2014

Procesul meu de raționament folosind emacs org-mode și node.js pentru a rula un test.

| use ==     | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | t     | f       | f         | f    | f          |
| '0'        |    | x   | t     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | t          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | t    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          | 



| use ===    | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | f     | f       | f         | f    | f          |
| '0'        |    | x   | f     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | f          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | f    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          |

Scriptul meu de testare de mai jos: run > node xxx.js

var rowItems = ['', '0', false, 'false', undefined, null, ' \t\r\n ']
var colItems = rowItems

for(var i = 0; i < rowItems.length; i++) {
    for (var j = 0; j < colItems.length; j++) {
        var r = (rowItems[i] === colItems[j]) ? true : false;
        console.log(rowItems[i] + " = " + colItems[j] + " " + r + " [" + i + "] ==> [" + j + "]")
    };
}
person CodeFarmer    schedule 06.08.2015

=== îi pasă dacă obiectele sunt aceleași. Prin urmare, new String("Hello world") === "Hello world" returnează false. Cu toate acestea, lui == nu îi pasă dacă obiectele sunt aceleași; pur și simplu convertește un argument în tipul celuilalt: dacă conversia nu este posibilă, returnează false. Apoi new String("Hello world") == "Hello world" returnează adevărat în loc de fals.

person Community    schedule 29.03.2015
comment
Acest răspuns este un pic greșit, sau, cel puțin, nu foarte precis... „obiecte”? Te referi la „tipuri”? == îi pasă dacă tipurile sunt aceleași; delegă la o comparație strictă a egalității dacă sunt. Două obiecte sunt comparate prin referință, dar acesta este cazul ambilor operatori. „dacă conversia nu este posibilă” — Bănuiesc... dar constrângerea este de obicei posibilă, iar aceasta nu este suficientă pentru a provoca unul sau altul rezultat al comparației, de ex. "undefined" != undefined, chiar dacă constrângerea ar fi posibilă. - person Sebastian Simon; 15.03.2021

Javascriptul este un limbaj tip slab, adică fără niciun tip de date, așa cum există în C,c++, de ex. int, boolean, float etc. astfel o variabilă poate deține orice tip de valoare, de aceea acești operatori speciali de comparație există

Eg

var i = 20;var j = "20";

dacă aplicăm operatori de comparație, rezultatul acestor variabile va fi

i==j //result is true

or

j != i//result is false

pentru asta avem nevoie de operatori de comparație speciali care verifică valoarea, precum și tipul de date ale variabilei

if we do

i===j //result is false
person Akshay Khale    schedule 22.07.2015

Diferența dintre = , = = , = = =

  • Operatorul = Folosit doar pentru a atribui value.
  • Operatorul = = Utilizat doar pentru a compara values nu datatype
  • Operatorul = = = Utilizat pentru a compara values și datatype.
person RïshïKêsh Kümar    schedule 25.06.2017

Operatorul == compară doar valorile, nu tipul de date.

operatorul === compară valorile cu compararea tipului său de date.

eg :

1 == "1" //true

1 === "1" //false

Acest operator ("===") folosit în limbi care efectuează turnarea automată de tipul de ex. PHP, Javascript.
"===" operator ajută la prevenirea comparațiilor neașteptate cauzate de tipul automat.

person Sharad Kale    schedule 28.04.2017
comment
pentru „==” dataType nu este important - person mrmr68; 25.05.2017
comment
@mrmr68 Tipul de operanzi ai Abstract Equality Comparison este foarte important — este folosit pentru a forța operanzii la alte tipuri, astfel încât să poată fi comparați. - person Sebastian Simon; 22.05.2020

folosește întotdeauna===” și ​​vei evita mii de greșeli. în zilele noastre, utilizarea egalității triple este mai de preferat de diferite ghiduri de stil, deoarece se compară ținând cont de tipul de operanzi.

person Alexandr    schedule 01.07.2016

Da, există o mare diferență între operatorii de egalitate == și de identitate ===.
De obicei, operatorul de identitate funcționează mai rapid, deoarece nu se realizează conversie de tipuri. Dar dacă valorile sunt de același tip, nu veți vedea nicio diferență.
Verificați postarea mea Legenda operatorului de egalitate JavaScript, care explică detaliile, inclusiv tipurile de algoritmi de conversie și comparație, cu o mulțime de exemple.

person Dmitri Pavlutin    schedule 04.01.2016

Unul motiv nemenționat pentru a utiliza === - este în cazul în care coexistați cu/compilarea încrucișată către/de la coffee-script. Din Little Book on CoffeeScript...

Comparația slabă a egalității în JavaScript are un comportament confuz și este adesea sursa erorilor confuze.

Soluția este să folosiți în schimb operatorul de egalitate strictă, care constă din trei semne egale: ===. Funcționează exact ca operatorul normal de egalitate, dar fără nici un fel de constrângere. Este recomandat să folosiți întotdeauna operatorul de egalitate strictă și să convertiți în mod explicit tipurile, dacă este necesar.

Dacă faceți o conversie regulată către și de la coffee-script, ar trebui să utilizați doar ===. De fapt, compilatorul coffee-script vă va forța să...

CoffeeScript rezolvă acest lucru prin simpla înlocuire a tuturor comparațiilor slabe cu unele stricte, cu alte cuvinte, conversia tuturor == comparatorilor în ===. Nu puteți face o comparație de egalitate slabă în CoffeeScript și ar trebui să convertiți în mod explicit tipurile înainte de a le compara, dacă este necesar.

person Alex Gray    schedule 15.05.2016

Egalitatea strictă este în cea mai mare parte mai bună

Faptul că Javascript este o limbă scrisă vag trebuie să fie în fața minții tale în mod constant pe măsură ce lucrezi cu el. Atâta timp cât structura datelor este aceeași, nu există într-adevăr niciun motiv să nu folosiți egalitatea strictă, cu egalitatea obișnuită aveți adesea o conversie implicită a valorilor care se întâmplă automat, acest lucru poate avea efecte de anvergură asupra codului dvs. Este foarte ușor să aveți probleme cu această conversie, văzând cum se întâmplă automat.

Cu o egalitate strictă nu există o conversie implicită automată, deoarece valorile trebuie să aibă deja structura corectă de date.

person Neil Meyer    schedule 16.11.2017

Javascript este tastat la fel cum este php,

var x = "20";
var y =20;

if (x===y) // false

Acest lucru vă va da întotdeauna un fals deoarece, deși valorile variabilelor sunt aceleași, tipurile de date nu sunt

Unul este șir, celălalt este int

If(x==y)//true

Totuși, aceasta verifică doar dacă conținutul este același, indiferent de tipurile de date...

Nu vreau să spun că valorile sunt egale, deoarece o valoare șir nu poate fi egală cu o valoare int în mod logic

person yanguya995    schedule 01.07.2016

În primul rând, o terminologie despre șirul Javascript equals: Double equals este cunoscut oficial ca operator de comparare a egalității abstracte, în timp ce triplu egal este numit operator de comparație de egalitate strictă. Diferența dintre ele poate fi rezumată după cum urmează: Egalitatea abstractă va încerca să rezolve tipurile de date prin constrângere de tip înainte de a face o comparație. Egalitatea strictă va returna false dacă tipurile sunt diferite. Luați în considerare următorul exemplu:

console.log(3 == "3"); // true
console.log(3 === "3"); // false.
console.log(3 == "3"); // true
console.log(3 === "3"); // false.

Utilizarea a două semne egale returnează adevărat, deoarece șirul „3” este convertit în numărul 3 înainte de a se face comparația. Trei semne egale văd că tipurile sunt diferite și returnează false. Iată altul:

console.log(true == '1'); // true
console.log(true === '1'); // false
console.log(true == '1'); // true
console.log(true === '1'); // false

Din nou, comparația de egalitate abstractă efectuează o conversie de tip. În acest caz, atât booleanul adevărat, cât și șirul „1” sunt convertiți în numărul 1 și rezultatul este adevărat. Egalitatea strictă este falsă.

Dacă înțelegeți că sunteți pe cale de a face distincția între == și ===. Cu toate acestea, există unele scenarii în care comportamentul acestor operatori nu este intuitiv. Să aruncăm o privire la câteva exemple suplimentare:

console.log(undefined == null); // true
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.
console.log(undefined == null); // true     
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.

console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false
console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false

Exemplul de mai jos este interesant, deoarece ilustrează faptul că literalele șir sunt diferite de obiectele șir.

console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
person Rotimi    schedule 24.04.2017

Motivul pentru care sugerează înlocuirea == cu === este că operatorul === este mai fiabil decât ==. În contextul nostru, mijloacele de încredere === sunt valabile și pentru verificarea tipului. Având în vedere cele mai bune practici de programare, ar trebui să alegem întotdeauna o funcție mai fiabilă în locul uneia mai puțin fiabile. Din nou, ori de câte ori ne gândim la exact egal cu operatorul de cele mai multe ori, considerăm implicit că tipul ar trebui să fie același. Deoarece === oferă același lucru, ar trebui să mergem pentru asta.

person Narendra Kalekar    schedule 01.08.2017

Dilema „Ar trebui să folosesc == sau === în comparația JavaScript” este egală sau analogă cu întrebarea: „Ar trebui să folosesc o „linguriță” sau o „furculiță” pentru a mânca.

Singurul răspuns rezonabil la această întrebare este că

  1. Ar trebui să utilizați comparația Tip dinamic, de exemplu:== pentru comparații cu Tip liber.
  2. Ar trebui să utilizați comparația Tip static, de exemplu:=== pentru comparații cu Tip puternic.

Asta pentru că nu sunt la fel. Ele nu au același scop și nu sunt menite să fie folosite în același scop.

Desigur, atât „furculițele” cât și „lingurile” sunt destinate „mâncării”, dar veți alege să le folosiți în funcție de ceea ce vi s-a servit să mâncați.

Semnificație: te vei hotărî să folosești o „linguriță”, adică: == pentru a bea o „ciorbă” și/sau „furculița”, adică: === pentru cules.

A întreba dacă este mai bine să folosești o „furculiță” sau o „linguriță” pentru „mâncat” - este egal cu a întreba dacă este mai bine să folosești un echivalent [===] static versus dinamic [==], op. în JS. Ambele întrebări sunt la fel de greșite și reflectă o înțelegere foarte îngustă sau superficială a subiectului în cauză.

person Bekim Bacaj    schedule 26.11.2017
comment
p.s.: JSLint (sau Crockford) este greșit când insistă sau îți cere să folosești o comparație strictă de tip atunci când ai de-a face cu valori de același tip. Proprietatea JavaScript length este întotdeauna de tip: număr. Și, prin urmare, nu există spațiu sau posibilitate pentru false pozitive. În plus, nu este nevoie de dSele_UNVEHtype.value.length === 0 când puteți folosi o prescurtare directă a lui !dSele_UNVEHtype.value.length. - person Bekim Bacaj; 06.12.2017
comment
De ce ați răspunde la o întrebare de 9 ani, care are deja 49 de răspunsuri, care are și un răspuns acceptat cu peste 5k de voturi pozitive, cu un răspuns care conține o analogie ciudată și nu explică nimic din ceea ce nu s-a spus deja? - person Jasper; 22.12.2017
comment
Pentru că există multe utilizări profesionale greșite ale JavaScript, indiferent cât de vechi sunt. Și, de exemplu, nu ați reușit să înțelegeți despre ce este vorba și să surprindeți esența diferenței pe care Live Script o face față de limbajele de tip static. Și de ce avem nevoie de dinamica sa inteligentă. JavaScript a fost creat pentru oameni inteligenți creativi, nu pentru nebuni. - person Bekim Bacaj; 26.12.2017
comment
Da, sunt de acord că există multe utilizări greșite ale JavaScript. Cu toate acestea, încă cred că analogia ta este ciudată, deoarece poate fi ușor înțeleasă greșit și nu acoperă elementele de bază de bază într-un mod semnificativ. - person Jasper; 27.12.2017
comment
Analogia dată este cea mai bună ilustrare vreodată a diferenței lor și a calității cazului de utilizare. Acesta este cel mai bun eseu scurt pentru a învăța esența absolută, chiar dacă sunteți complet nou venit la JS. Și este la fel de bun, probabil mai bun decât răspunsul meu târziu despre cum să golesc o matrice JS [pe bune]. - person Bekim Bacaj; 28.12.2017

Folosiți === dacă doriți să comparați câteva lucruri în JavaScript, se numește egalitate strictă, înseamnă că va returna adevărat dacă numai tipul și valoarea sunt aceleași, deci există nu ar fi nicio corecție de tip nedorită pentru dvs., dacă utilizați ==, practic nu vă pasă de tip și, în multe cazuri, ați putea întâmpina probleme cu o comparație de egalitate slabă.

Egalitatea strictă folosind ===

Egalitatea strictă compară două valori pentru egalitate. Nicio valoare nu este convertită implicit într-o altă valoare înainte de a fi comparată. Dacă valorile au tipuri diferite, valorile sunt considerate inegale. În caz contrar, dacă valorile au același tip și nu sunt numere, ele sunt considerate egale dacă au aceeași valoare. În cele din urmă, dacă ambele valori sunt numere, ele sunt considerate egale dacă ambele nu sunt NaN și au aceeași valoare, sau dacă una este +0 și una este -0.

var num = 0;
var obj = new String('0');
var str = '0';

console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true

console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false


Egalitatea slăbită folosind ==

Egalitatea liberă compară două valori pentru egalitate, după conversia ambelor valori într-un tip comun. După conversii (una sau ambele părți pot suferi conversii), comparația finală a egalității este efectuată exact așa cum o efectuează ===. Egalitatea liberă este simetrică: A == B are întotdeauna o semantică identică cu B == A pentru orice valoare a lui A și B (cu excepția ordinii conversiilor aplicate).

var num = 0;
var obj = new String('0');
var str = '0';

console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true

console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true

// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
person Alireza    schedule 07.05.2017
comment
Cred că este subiectiv în ceea ce privește ceea ce ar trebui/nu ar trebui să faci și induce în eroare să spui cuiva să folosească întotdeauna o anumită acțiune. Deși sunt de acord că în majoritatea cazurilor ne interesează să folosim „===” versus „==”, poate exista un caz special în care doriți ca conversia tipului să fie efectuată. - Nu mă pot gândi la un caz exact de utilizare, dar poate că designul este să aibă o verificare liberă. Indiferent, dacă ceva este inclus în limbă, este acolo cu un motiv. În opinia mea, ar trebui să încercăm să evităm declarațiile acoperite de „fă întotdeauna x”. - person SeanRamzan; 18.05.2017
comment
Sunt de acord cu tine, dacă mi-ai citit întregul răspuns, vezi că explic în mai multe detalii mai târziu, sincer să fiu, nu sunt multe cazuri pe care le folosim și avem nevoie de comparație liberă în Javascript... Pot spune mai puțin de 5 la sută , cu atât mai puțin, dar folosesc „întotdeauna“ pentru acei oameni fără antecedente js, care cred că == verifică comparația strictă în JavaScript, învață să fie precauți și să nu-l folosească de la început, dar pe măsură ce devin mai experți, ei știți în ce cazuri rare l-ar putea folosi. De aceea îmi scriu răspunsul așa. - person Alireza; 18.05.2017

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Am văzut asta într-unul dintre răspunsuri. a și b nu sunt cu adevărat de același tip în acest caz, dacă veți bifa typeof(a) veți obține 'obiect' și typeof(b) este 'șir'.

person Orri Scott    schedule 05.07.2016