İki değeri derinlemesine karşılaştıran bir deepEqual fonksiyonu yazın.
Cevap
=== nesneleri referansla karşılaştırır; deepEqual ise yapıları recursive olarak dolaşıp içerik eşitliğine bakar.
function deepEqual(a, b) {
if (Object.is(a, b)) return true; // NaN === NaN durumunu da yakalar
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
return false;
}
if (Array.isArray(a) !== Array.isArray(b)) return false;
if (Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) return false;
if (a instanceof Date) return a.getTime() === b.getTime();
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
return keysA.every(
(key) => Object.prototype.hasOwnProperty.call(b, key) && deepEqual(a[key], b[key])
);
}
deepEqual({ a: [1, { b: 2 }] }, { a: [1, { b: 2 }] }); // true
deepEqual([1, 2], { 0: 1, 1: 2 }); // false
deepEqual(NaN, NaN); // trueNeden JSON.stringify yetmez?
- Anahtar sırası farklıysa (
{a:1,b:2}ve{b:2,a:1}) yanlış sonuç verir. undefined, fonksiyon,Symbolkaybolur;NaNnullolur;Datestring'e döner.
Follow-up'lar
Map,Set,RegExp, typed array desteği.- Döngüsel referanslar: ziyaret edilen çiftleri bir
WeakMapile takip ederek sonsuz döngüyü önleyin. - Gerçek projelerde Lodash
isEqualveyanode:util'dekiisDeepStrictEqualkullanılır.
İlgili JavaScript soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.