Object.is vs ===


141

Bu karşılaştırmayı kullanan bir kod örneği tökezledi:

var someVar = 0;
Object.is(false, someVar); //Returns false 

Biliyorum false == 0olacak trueElimizdeki bu yüzden en ===.

Nasıl Object.isfarklı gelen ===?

Yanıtlar:


174

===JavaScript'te katı karşılaştırma operatörü olarak adlandırılır. Object.isve sıkı karşılaştırma operatörü NaNve dışında tam olarak aynı davranır +0/-0.

MDN'den:

Object.is()yöntemi ===operatöre göre eşit olmakla aynı değildir . ===Operatör (ve ==ayrıca operatörü) sayısı değerleri -0 ve eşit + 0 ve muamele davranır Number.NaNeşit değildir NaN.

Aşağıdaki kod ===ve arasındaki farkı vurgular 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

resim açıklamasını buraya girin

Burada daha fazla örnek bulabilirsiniz .

Not : Object.isECMAScript 6 teklifinin bir parçasıdır ve henüz geniş çapta desteklenmemektedir (örn. Internet Explorer'ın herhangi bir sürümü veya diğer tarayıcıların birçok eski sürümü tarafından desteklenmemektedir). Bununla birlikte, ES6 olmayan tarayıcılar için yukarıda verilen bağlantıda bulunan bir çoklu dolgu kullanabilirsiniz.


26
Cevabın ilk satırı muhtemelen "NaN ve +0 ve -0 dışında tamamen aynı davranıyorlar" olmalıdır.
Benjamin Gruenbaum

1
@BenjaminGruenbaum İyi öneri. Yanıtın okunmasını kolaylaştırır. Şerefe.
Gurpreet Singh

3
@ humble.rumble bunun uzunluğu tartışıldı - statik yöntemler daha basittir - bağlam sorunları veya ilkel konular yoktur. Örneğin, örneğinizde yanlış olmasını beklerdim ama JS'ye yeni gelenler bir dize üzerinde bir nesneye (ve bir dize ilkel değeri değil) kutulara yaptığınız ve karşılaştırma bir nesne ile bir dize arasında olacağı için doğru olacağını beklerdi - bu çok ince ve bir tuzaktır - statik bu sorunlardan kaçınır, statik yöntemler daha basit ve kullanımı daha kolaydır. .xString
Benjamin Gruenbaum

2
@ humble.rumble DOM düğümlerini karşılaştırmak için zaten böyle bir yöntem var, bkz. isEqualNode . Örnek:document.createElement('div').isEqualNode(document.createElement('div')) === true
Rob W

2
2017 Güncellemesi: Object.is () artık tüm büyük tarayıcılarda yaygın olarak desteklenmektedir.
Sterling Bourne

56

Object.isşartname kullanan SameValue algoritması , oysa ===kullanım Katı Eşitlik Algoritması . Sıkı Eşitlik Algoritması üzerine bir not farkı ortaya koyuyor:

Bu algoritma SameValue Algoritmasından ... imzalı sıfırlar ve NaN'lerin tedavisinde farklıdır.

Bunu not et:

  • NaN === NaNyanlış, ama Object.is(NaN, NaN)doğru
  • +0 === -0doğru, ama Object.is(+0, -0)yanlış
  • -0 === +0doğru, ama Object.is(-0, +0)yanlış

JavaScript'te en az dört çeşit "eşitlik" vardır:

  • "Gevşek" ( ==), işlenenlerin eşleşmesini sağlamak için zorlanacaktır. Kurallar açıkça belirtilir , ancak açık değildir. ( "" == 0is true; "true" == trueis false, ...).
  • ===Farklı türlerin işlenenlerinin zorlanmayacağı (ve eşit olmayacağı) "katı" ( ), ancak yukarıdaki nota NaNve pozitif ve negatif sıfıra bakınız.
  • SameValue - yukarıda listelendiği gibi (tarafından kullanılır Object.is).
  • SameValueZero benzeri SameValuehariç +0ve -0farklı yerine aynıdır ( Mapanahtarlar tarafından ve tarafından kullanılır Array.prototype.includes).

Dil veya çalışma zamanının kendisi tarafından sağlanmayan, ancak genellikle şu şekilde ifade edilen nesne denkliği de vardır : Nesneler aynı prototip, aynı özelliklere sahiptir ve özellik değerleri aynıdır ("aynı" nın bazı makul tanımlarıyla ).


SameValue algoritması :

  • (X) Tipi (y) Tipinden farklıysa false değerini döndürün.
  • Tür (x) Sayı ise, o zaman
    • X NaN ve y NaN ise, true değerini döndürün.
    • X +0 ve y -0 ise false değerini döndürün.
    • X -0 ve y +0 ise false değerini döndürün.
    • X, y ile aynı Sayı değeriyse, true değerini döndürün.
    • Yanlış döndür.
  • SameValueNonNumber (x, y) döndür.

... burada SameValueNonNumber :

  • Onaylama: (x) türü Sayı değil.
  • Assert: Tür (x), Tür (y) ile aynıdır.
  • (X) Türü Tanımsızsa true değerini döndürün.
  • (X) türü Null ise, true değerini döndürün.
  • Tür (x) Dize ise,
    • X ve y tam olarak aynı kod birimleri dizisiyse (karşılık gelen dizinlerde aynı uzunluk ve aynı kod birimleri), true değerini döndürür; aksi takdirde false değerini döndürün.
  • (X) Türü Boole ise,
    • X ve y'nin ikisi de true veya false ise, true değerini döndürün; aksi takdirde false değerini döndürün.
  • Tür (x) Sembol ise,
    • X ve y'nin ikisi de aynı Symbol değerine sahipse, true değerini döndürün; aksi takdirde false değerini döndürün.
  • X ve y aynı Object değerine sahipse true döndür. Aksi takdirde, false değerini döndürün.

Katı Eşitlik Algoritması :

  1. (X) Tipi (y) Tipinden farklıysa false değerini döndürün.
  2. Tür (x) Sayı ise, o zaman
    • X NaN ise false değerini döndürün.
    • Y NaN ise false değerini döndürün.
    • X, y ile aynı Sayı değeriyse, true değerini döndürün.
    • X +0 ve y -0 ise true değerini döndürün.
    • X -0 ve y +0 ise, true değerini döndürün.
    • Yanlış döndür.
  3. SameValueNonNumber (x, y) döndür.

2

Object.is = function(v1, v2){
  //test for `-0`
  if(v1 === 0 && v2 === 0) {
    return 1 / v1 === 1 / v2;
  }
  
  //test for `NaN`
  if(v1 !== v1) {
    return v2 !== v2;
  }
  
  //everything else
  return v1 === v2;
}

Yukarıdaki, Object.isbilmek isteyen herkes için nasıl çalıştığını gösteren çoklu doldurma işlevidir . You-Don't-Know-JS'a bir referans


2

Özet:

Object.is()Fonksiyon aksi takdirde yanlış döndürür, bağımsız değişken olarak 2 değerlerini alır ve 2 verilen değerler aynı ise doğru döndürür.

buna neden ihtiyacımız var?

===Operatörün javascript'te sıkı bir eşitlik (tip + değer kontrolü) kontrolümüz olduğunu düşünebilirsiniz, neden bu işleve ihtiyacımız var? Bazı durumlarda katı eşitlik yeterli değildir ve bunlar şunlardır:

console.log(NaN === NaN);   // false
console.log(-0 === +0);     // true

Object.is() katı eşitlik operatörünün yapamayacağı bir şey olup olmadığını görmek için bu değerleri karşılaştırarak bize yardımcı olur.

console.log(Object.is(NaN, NaN));  // true
console.log(Object.is(-0, 0));     // false
console.log(Object.is(+0, +0));    // true
console.log(Object.is(+0, -0));    // false


0

Özetle, benzerler, ancak Object.isdaha akıllı ve daha doğru ...

Şuna bakalım ...

+0 === -0 //true

Ancak bu, görmezden geldiği -ve daha +önce olduğu gibi tam olarak doğru değil ...

Şimdi kullanıyoruz:

Object.is(+0, -0) //false

Gördüğünüz gibi, bu karşılaştırmak daha doğru.

Ayrıca NaN, bunun NaNaynı şekilde düşünülmesi gibi, daha doğru gibi çalışması durumunda .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.