Soru JavaScript karşılaştırmasında hangi eşit operatör (= vs vs ===) kullanılmalıdır?


kullanıyorum JSLint JavaScript’ten geçmek ve yerini alacak birçok öneride bulunmak == (iki eşittir işareti) ile === Karşılaştırma gibi şeyler yaparken (üç eşittir işareti) idSele_UNVEHtype.value.length == 0 bir içinde if Beyan.

Değiştirmeye yönelik bir performans avantajı var mı == ile ===?

Birçok karşılaştırma operatörü mevcut olduğundan, herhangi bir performans iyileştirmesi memnuniyetle karşılanacaktır.

Herhangi bir tür dönüşüm gerçekleşmezse, bir performans artışı olur muydu? ==?


5674
2017-12-11 14:19


Menşei


Aynı konuyla kime ilgi olabilir === vs ==ama PHP’de buradan okuyabilirsiniz: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/... - Marco Demaio
Sadece 2012'de merak edenler için: === olduğu yol daha hızlı ==. jsperf.com/comparison-of-comparisons - Ry-♦
@minitech tür dönüşüm yapmaz gibi olmalı - Umur Kontacı
@minitech, herkesin uygulamalarını farkedilir derecede daha hızlı hale getireceğinden şüphe duyuyorum === üzerinde ==. Aslında, kıyaslama modern tarayıcılar arasında büyük bir farklılık göstermemektedir. Şahsen ben kullanırım == Gerçekten her yerde sıkı eşitliğe ihtiyacım olmadığı sürece. - this.lau_
@johndodo: Prematüre Optimizasyonu sadece bir şeydir çünkü optimize edilmiş kod, bir sürdürülebilirlik ve okunabilirlik açısından daha az ideal olabilir, ancak eğer tür dönüşüm özellikleri == gerekli değildir, kullanımı === bunun yerine iyi bir uygulama, erken optimizasyon değil. Hakkında bir şey yok === Bu kodun okunabilirliğini veya okunabilirliğini bozar. - Robert Harvey♦


Cevaplar:


Kimlik (===) operatör eşit olarak eşit davranır (==) Hiçbir tip dönüşüm yapılmadığı sürece operatörler yapılır ve türler eşit kabul edilmek için aynı olmalıdır.

Referans: Javascript Eğitimi: Karşılaştırma Operatörleri

== operatör eşitlik için karşılaştırır gerekli tür dönüşümleri yaptıktan sonra. === operatör değil dönüşüm yapmak, bu yüzden iki değer aynı türde değilse === sadece dönecek false. Her ikisi de eşit derecede hızlıdır.

Douglas Crockford’un mükemmelliğini söylemek için JavaScript: İyi Parçalar,

JavaScript'in iki eşitlik operatörü grubu vardır: === ve !==ve onların kötü ikizleri == ve !=. İyi olanlar beklediğiniz gibi çalışır. İki işlenen aynı türde ve aynı değere sahipse, o zaman === üretir true ve !== üretir false. Kötücül ikizler, işlenenler aynı türdeyken doğru olanı yaparlar, fakat eğer farklı türdeyse, değerleri zorlamaya çalışırlar. Yaptıkları kurallar karmaşık ve güzeldir. Bunlar ilginç vakalardan bazıları:

'' == '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

Transitivitenin eksikliği endişe verici. Benim tavsiyem, şeytani ikizleri asla kullanmamak. Bunun yerine, her zaman kullanın === ve !==. Az önce gösterilen tüm karşılaştırmalar false ile === Şebeke.


Güncelleştirme:

İyi bir nokta tarafından gündeme getirildi @Casebash yorumlarda ve içinde @Phillipe Laybaert's  Cevap Referans türleri ile ilgili. Referans türleri için == ve === Birbiriyle tutarlı olarak davranmak (özel bir durum hariç).

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

Özel durum, bir edebi ile aynı değişkeni değerlendiren bir nesneyi karşılaştırdığınızda, toString veya valueOf yöntem. Örneğin, bir dize değişmezinin, tarafından oluşturulan bir dize nesnesiyle karşılaştırılmasını düşünün. String Yapıcı.

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

İşte == operatör iki nesnenin değerlerini kontrol ediyor ve geri dönüyor true, ama === aynı türde olmadıklarını ve geri döndüklerini görüyor false. Hangisi doğru? Bu gerçekten karşılaştırmaya çalıştığınız şeye bağlı. Benim tavsiyem, soruyu tamamen atlatmak ve sadece String string nesneleri oluşturmak için kurucu.

Referans
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


5728
2017-12-11 14:25



türler aynı ise === daha hızlı değildir. Türler aynı değilse, === daha hızlı olacaktır çünkü dönüştürme işlemini yapmaya çalışmaz. - Bill the Lizard
=== asla =='dan daha yavaş olmayacaktır. Her ikisi de yazım denetimi yaparlar, bu nedenle === == ile karşılaştırıldığında fazladan bir şey yapmazlar, ancak tür kontrolü, türler aynı olmadığında daha erken çıkmak için izin verebilir. - Bill the Lizard
All == /! = With === /! == öğesinin değiştirilmesi js dosyasının boyutunu artırır, daha sonra yüklenecek daha fazla zaman alır. :) - Marco Demaio
“... onların yaptıkları kurallar karmaşık ve akıl dışıdır ...” Şimdi bu tür ifadeler programlarken kendinizi güvende hissetmenizi sağlar ... - Johan
Bazen JavaScript'in tip sistemi beni çığlık atmak istemiyor. - Yawar


Kullanmak ==Şebeke (eşitlik)

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

Kullanmak ===Şebeke (Kimlik)

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

Çünkü eşitlik operatörü == zorlama yazıyoryani yorumcunun örtülü olarak karşılaştırmadan önce değerleri dönüştürmeye çalıştığı anlamına gelir.

Öte yandan, kimlik operatörü === tip baskısı yapmazve dolayısıyla karşılaştırırken değerleri dönüştürmez.


990
2018-06-05 19:11



@ Yazılım Maymun: değer türleri için değil (sayı, boole, ...) - Philippe Leybaert
type coercion vs type casting vs type convertion: stackoverflow.com/questions/8857763/... - Adrien Be
Kimse Javascript Eşitlik Tablosundan bahsetmediğinden, işte burada: dorey.github.io/JavaScript-Equality-Table - blaze
İlk ifadede, 'gerçek' 1'e dönüştürülmüş ve 1'i doğruya dönüştürülmediğinden emin misiniz? - Shadi Namrouti
"Eşitlik" ve "kimlik" terimleri nereden geliyor? Standart bu şartları kullanmaz. Çağırır == "soyut eşitlik" ve bu çağrıları ==="sıkı eşitlik". Verilen çağrı == her türlü "eşitlik" IMHO'dur, çünkü geçişli değil, neden kelime oyunu? Yine de "kimlik" ile daha fazla sorun alıyorum; Bence bu terim oldukça yanıltıcı, "işe yarıyor" diye düşünüyorum. Ama cidden, "kimlik" terimini kim yaptı? Standardı araştırıyorum ve bulamadım. - Ray Toal


Buradaki cevaplarda, ne hakkında bir şey okumadım. eşit anlamına geliyor. Bazıları bunu söyleyecektir === anlamına geliyor eşit ve aynı tipama bu gerçekten doğru değil. Aslında bu demek oluyor ki her iki işlenen aynı nesneyi referans alırveya durumunda değer türleri, aynı değere sahip.

Yani, şu kodu alalım:

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

Aynı burada:

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

Ya da:

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

Bu davranış her zaman açık değildir. Hikayede, eşit ve aynı türden olmaktan daha fazlası var.

Kural şudur:

Değer türleri için (sayılar):
a === b doğruysa döner a ve b aynı değere sahip ve aynı tipte

Referans türleri için:
a === b doğruysa döner a ve b tam aynı nesneyi referans

Dizeler için:
a === b doğruysa döner a ve b hem dizelerdir hem de tam olarak aynı karakterleri içerir


Dizeler: özel durum ...

Dizeler değer türleri değildir, ancak Javascript'te değer türleri gibi davranırlar, böylece dizedeki karakterler aynı olduğunda ve aynı uzunlukta olduklarında "eşittir" olurlar (üçüncü kuralda açıklandığı gibi)

Şimdi ilginç oluyor:

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

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

Ama buna ne dersin?

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

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

Dizelerin değer türleri gibi davrandığını sanıyordum? Peki, kime sorduğuna göre değişir ... Bu durumda a ve b aynı türde değildir. a tipi Object, süre b tipi string. Sadece kullanarak bir string nesnesi oluşturmayı unutmayın. String kurucu türden bir şey oluşturur Object bu bir dizge gibi davranır çoğu zaman.


546
2018-05-05 05:21



activa: Açıkça söylerim ki, dizeler sadece edebi olduklarında eşit olurlar. yeni Dize ("abc") === "abc" yanlıştır (araştırmamıza göre). - Lawrence Dol
new Number() == "0". Ayrıca Firefox'ta: (function(){}) == "function () {\n}" - Thomas Eding
Nedenini açıkladığın için teşekkür ederim new String("123") !== "123". Onlar farklı tipler. Basit ama kafa karıştırıcı. - styfle
String nesneler, dizeler gibi davranır başka herhangi bir nesne. new String Asla kullanılmamalıdır, çünkü bu gerçek dizeleri yaratmaz. Gerçek bir dize ve dize hazır bilgi veya çağrı ile yapılabilir String işlev olarak olmadan  new, Örneğin: String(0); //"0", Real string, not an object - Esailija
Ama ayrıntılı olarak, operatör "==" tam olarak aynı davranır. - Yaron Levi


Eşitlik karşılaştırmasının ilginç bir resimsel temsili == ve ===.

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


var1 === var2

Kullanırken === JavaScript eşitliği testi için her şey olduğu gibi. Değerlendirilmeden önce hiçbir şey dönüştürülmez.

Equality evaluation of === in JS


var1 == var2

Kullanırken == JavaScript eşitliği testi için, bazıları   funky dönüşümler gerçekleşir.

Equality evaluation of == in JS

Hikayeden çıkarılacak ders: 

kullanım === tamamen anlamadıkça   ile gerçekleşen dönüşümler ==.


522
2017-11-28 18:18



@mfeine, === veya! == yerine == veya! = anlamına gelir. Yeni kodlayıcıları karıştırmak istemiyorum;) - katalin_2003
@ katalin_2003 oops, haklısın === ve! ==, d ** n yazım hataları, thx - mfeineis
@vsync: Wow, JQuery'yi kötüye kullanan insanlar da aynı şeyi söylüyorlar. Asla çok ortak olduğunu bilmiyordum ...
@vsync: Eğer siz gerçekten türlerin eşit olmasını istemiyorum, sen meli kullanım üç eşittir! - SNag
Bu cevap çok yararlı! - skiabox


Bu danışmanı ekleyeyim:

Şüpheniz varsa, okuyun Şartname! 

ECMA-262, JavaScript'in bir diyalekt olduğu bir komut dosyası dilinin belirtimidir. Elbette pratikte, en önemli tarayıcıların, bir şeyin nasıl ele alınması gerektiğinin ezoterik bir tanımından daha çok nasıl davrandığını daha fazla önemsiyor. Ama neden olduğunu anlamak yardımcı oluyor yeni Dize ("a")! == "a".

Lütfen bu sorunun açıklığa kavuşturulması için şartnamenin nasıl okunacağını açıklamama izin verin. Gördüğüm kadarıyla bu çok eski konuya kimse çok garip bir etki için cevap vermedi. Yani, bir şartnameyi okuyabiliyorsanız, bu sizin mesleğinizde size muazzam bir şekilde yardımcı olacaktır. Kazanılmış bir beceridir. Yani devam edelim.

=== için PDF dosyasının aranması, belirtimin 56. Sayfasını getirir: 11.9.4. Sıkı Eşit Operatör (===)ve bulduktan sonra spesifikasyona geçtikten sonra:

11.9.6 Sıkı Eşitlik Karşılaştırma Algoritması
  X = y = y olduğunda, x ve y değerleri değerdir. doğru veya yanlış. Böyle bir karşılaştırma aşağıdaki gibi gerçekleştirilir:
  1. Eğer Tip (x), Tip (y) 'den farklıysa, geri dönüş yanlış.
  2. Eğer Tip (x) Tanımlanmamış ise, doğru.
  3. Eğer Tip (x) Boş ise, dönüş doğru.
  4. Eğer Type (x) Number değilse, adım 11'e gidin.
  5. x ise NaN, dönüş yanlış.
  6. y ise NaN, dönüş yanlış.
  7. x, y ile aynı sayı ise, doğru.
  8. x +0 ve y −0 ise, dönüş doğru.
  9. x −0 ise ve y +0 ise, doğru.
  10. Dönüş yanlış.
  11. Eğer Type (x) String ise, o zaman geri dönün. doğru x ve y aynı karakter dizisiyse (karşılık gelen konumlarda aynı uzunluk ve aynı karakterler); aksi halde, dönüş yanlış.
  12. Tip (x) Boole ise, döndürün doğru eğer x ve y her ikisi de doğru ya da her ikisi de yanlış; aksi halde, dönüş yanlış.
  13. dönüş doğru x ve y aynı nesneyi ifade ederlerse veya birbirleriyle birleştirilen nesnelere atıfta bulunurlarsa (bkz. 13.1.2). Aksi takdirde, dönüş yanlış.

İlginç olan adım 11'dir. Evet, dizeler değer türleri olarak kabul edilir. Ama bu nedenini açıklamıyor yeni Dize ("a")! == "a". ECMA-262'ye uygun olmayan bir tarayıcımız var mı?

Çok hızlı değil!

İşlenenlerin türlerini kontrol edelim. Bunları paketleyerek kendiniz için deneyin bir çeşit(). Onu buldum yeni Dize ("a") bir nesnedir ve adım 1 kullanılır: dönüş yanlış türleri farklıysa.

Nedenini merak ediyorsanız yeni Dize ("a") bir dizi döndürmez, nasıl bir şartname okuyorsunuz? İyi eğlenceler!


Aidiakapi bunu aşağıdaki bir yorumda yazdı:

Şartname

11.2.2 Yeni Operatör:

Tür (yapıcı) Nesne değilse, bir TypeError istisnası atın.

Diğer bir deyişle, String, Type yazısında olmazsa, yeni operatörle kullanılamaz.

yeni her zaman için bir Nesne döndürür sicim Kurucular da. Ve alas! Dizeler için değer semantiği (bkz. Adım 11) kaybolur.

Ve bunun anlamı şu: yeni Dize ("a")! == "a".


250
2018-05-12 12:58



Tip (x) 'nin sonucu tipeof ile aynı olduğu ima edilir? - Dfr


PHP ve JavaScript'te sıkı bir eşitlik operatörüdür. Bu, hem tür hem de değerleri karşılaştırır.


93
2017-12-25 11:17



@David: Doğru. Bu yüzden bu cevap yanlış (hatta yanlış) - Philippe Leybaert
@ David var a = {}, b = {};  a == b false değerini döndürür. - nyuszika7h
Evet: iki farklı Aynı tür ve değere sahip nesneler yanlış karşılaştırır, yani bu cevap yanlıştır. Neden 50 tane oyu var? - alexis
Bunun eski olduğunu anlıyorum, ama bu cevabın neden hala "doğru" olduğunu açıklığa kavuşturmak örnekte olduğu için var a = {}, b = {}; Her ikisi de a ve b aslında bir nesne, ama onlar değil aynı teknik olarak konuşan değer. Onlar farklı örnekleri. Örnekleri karşılaştırmanın, ilkelleri karşılaştırmaktan farklı davrandığını unutmayın. Muhtemelen bu karışıklığa katkıda bulunur. İlkel veri türlerinin örnek sürümünü kullanıyorsanız benzer karşılaştırma davranışını göreceksiniz. Örneğin new String('asdf') veya new Number(5). Ör: new Number(5) == new Number(5) aynı değere sahip olsalar bile yanlıştır. - Norman Breau


Bunu Firefox'ta test ettim. kundakçı bu gibi kod kullanarak:

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

ve

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

Sonuçlarım (her biri beş kez test edildi ve ortalaması alındı):

==: 115.2
===: 114.4

Bu yüzden minik farkın (bu 100000 iterasyonun üstündedir, hatırlayın) ihmal edilebilir olduğunu söyleyebilirim. performans değil yapmak için bir sebep ===. Güvenlik yazın (JavaScript’te alacağınız kadar güvenli) ve kod kalitesi.


88
2018-05-12 12:58



Tipik güvenlikten çok mantıksal doğruluk istersiniz - bazen bazı şeylerin doğru olduğunda == katılmıyor. - rpjohnst
Şimdi, bunlar gerçek bir tür gömülme olduğunda nasıl karşılaştırılır? == Şebeke? Unutma, o zaman bir performans artışı var. - Hubert OG
Daha önce belirtilen nedenlerden dolayı düzgün bir şekilde test edildiğinde MAJOR farkı sadece tip eşitsizliğini kontrol etmektir. jsfiddle.net/4jhuxkb2 - Doug Morrow


JavaScript'te aynı değer ve tipte demektir.

Örneğin,

4 == "4" // will return true

fakat

4 === "4" // will return false 

84
2017-12-11 14:58





=== operatör sıkı bir karşılaştırma operatörü denir yapar farklı == Şebeke.

2 tane alalım a ve b.

İçin "a == b" doğru a ve b'yi değerlendirmek aynı değer.

Bu durumuda "a === b" a ve b olmalı aynı değer ve ayrıca aynı tip doğruyu değerlendirmek için.

Aşağıdaki örneğe geçin

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");
}

Özetle; kullanmak == Operatörün bunu kullanmak istemediğiniz durumlarda doğruyu değerlendirebilir. === Operatör daha güvenli olur.

% 90'lık kullanım senaryosunda hangisini kullandığınız önemli değil, ama bir gün beklenmedik davranışlar fark ettiğinizde farkı bilmek kullanışlı.


73
2018-05-12 12:58



İşte burada === vs == karşılaştırması ile ilgili ayrıntılı bir yazı var. - Zaheer Ahmed