Saya menemukan contoh kode yang menggunakan perbandingan ini:
var someVar = 0;
Object.is(false, someVar); //Returns false
Aku tahu false == 0
akan true
bahwa ini mengapa kita memiliki ===
.
Bagaimana Object.is
bedanya ===
?
sumber
Saya menemukan contoh kode yang menggunakan perbandingan ini:
var someVar = 0;
Object.is(false, someVar); //Returns false
Aku tahu false == 0
akan true
bahwa ini mengapa kita memiliki ===
.
Bagaimana Object.is
bedanya ===
?
===
disebut operator perbandingan ketat dalam JavaScript. Object.is
dan operator perbandingan ketat berperilaku sama persis kecuali untuk NaN
dan +0/-0
.
Dari MDN:
Object.is()
Metode tidak sama dengan menjadi sama menurut===
operator. The===
operator (dan==
Operator juga) memperlakukan nilai-nilai jumlah -0 dan 0 sebagai sama dan memperlakukanNumber.NaN
tidak sama untukNaN
.
Kode di bawah ini menyoroti perbedaan antara ===
dan 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
Anda dapat menemukan lebih banyak contoh di sini .
Catatan : Object.is
adalah bagian dari proposal ECMAScript 6 dan belum didukung secara luas (mis. Belum didukung oleh versi Internet Explorer atau banyak versi browser lainnya). Namun Anda dapat menggunakan polyfill untuk browser non-ES6 yang dapat ditemukan di tautan yang diberikan di atas.
.x
pada kotak string itu menjadiString
objek (dan bukan nilai primitif string) dan perbandingan akan antara objek dan string - ini sangat halus dan merupakan jebakan - statika menghindari masalah ini, metode statis lebih sederhana dan lebih mudah digunakan.document.createElement('div').isEqualNode(document.createElement('div')) === true
Object.is
menggunakan algoritme SameValue spesifikasi , sedangkan===
menggunakan Algoritma Ketat Persamaan . Catatan tentang Algoritma Kesetaraan Ketat menyebutkan perbedaannya:Perhatikan bahwa:
NaN === NaN
itu salah, tetapiObject.is(NaN, NaN)
itu benar+0 === -0
itu benar, tetapiObject.is(+0, -0)
salah-0 === +0
itu benar, tapiObject.is(-0, +0)
salahJavaScript memiliki setidaknya empat jenis "kesetaraan":
==
), di mana operan akan dipaksa untuk membuatnya cocok. Aturannya jelas ditentukan , tetapi tidak jelas. ("" == 0
adalahtrue
;"true" == true
adalahfalse
, ...).===
), di mana operan dari jenis yang berbeda tidak akan dipaksa (dan tidak akan sama), tetapi lihat catatan di atas tentangNaN
dan nol positif dan negatif.Object.is
).SameValue
kecuali+0
dan-0
sama, bukan berbeda (digunakan olehMap
untuk kunci, dan olehArray.prototype.includes
).Ada juga ekuivalensi objek , yang tidak disediakan oleh bahasa atau runtime itu sendiri, tetapi biasanya dinyatakan sebagai: Objek memiliki prototipe yang sama, properti yang sama, dan nilai propertinya sama (oleh beberapa definisi masuk akal "sama" ).
Algoritma SameValue :
... di mana SameValueNonNumber adalah:
Algoritma Persamaan Ketat :
sumber
Di atas adalah fungsi polyfill untuk menunjukkan cara
Object.is
kerjanya, bagi siapa saja yang tertarik untuk mengetahuinya. Referensi ke You-Don't-Know-JSsumber
Ringkasan:
Itu
Object.is()
Fungsi mengambil 2 nilai sebagai argumen dan mengembalikan nilai true jika 2 nilai yang diberikan adalah persis sama, selain itu akan kembali palsu.kenapa kita butuh ini?
Anda mungkin berpikir, kita sudah memiliki kesetaraan yang ketat (memeriksa tipe + nilai) memeriksa javascript dengan
===
operator, mengapa kita membutuhkan fungsi ini? Kesetaraan yang ketat tidak cukup dalam beberapa kasus dan mereka adalah sebagai berikut:Object.is()
membantu kami dengan dapat membandingkan nilai-nilai ini untuk melihat apakah mereka serupa, sesuatu yang tidak dapat dilakukan oleh operator kesetaraan yang ketat.sumber
Singkatnya, mereka serupa, tetapi
Object.is
lebih pintar dan lebih akurat ...Mari kita lihat ini ...
Tapi ini tidak sepenuhnya benar karena mengabaikan
-
dan+
sebelum ...Sekarang kami menggunakan:
Seperti yang Anda lihat, ini lebih akurat untuk dibandingkan.
Juga dalam hal
NaN
itu berfungsi lebih seperti benar, karena menganggapnyaNaN
sama.sumber