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 ===?
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:
===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ırNumber.NaNeşit değildirNaN.
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

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.
.xString
document.createElement('div').isEqualNode(document.createElement('div')) === true
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:
==), 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.Object.is).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 ).
- (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.
- (X) Tipi (y) Tipinden farklıysa false değerini döndürün.
- 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.
- SameValueNonNumber (x, y) döndür.
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
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.
===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
Ö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 .