İ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);                                    // true

Neden JSON.stringify yetmez?

  • Anahtar sırası farklıysa ({a:1,b:2} ve {b:2,a:1}) yanlış sonuç verir.
  • undefined, fonksiyon, Symbol kaybolur; NaN null olur; Date string'e döner.

Follow-up'lar

  • Map, Set, RegExp, typed array desteği.
  • Döngüsel referanslar: ziyaret edilen çiftleri bir WeakMap ile takip ederek sonsuz döngüyü önleyin.
  • Gerçek projelerde Lodash isEqual veya node:util'deki isDeepStrictEqual kullanılır.
  1. var, let ve const arasındaki fark nedir?KolayJavaScriptFrontend
  2. == ile === arasındaki fark nedir?KolayJavaScriptFrontend
  3. Closure nedir? Bir örnekle açıklayın.OrtaJavaScriptFrontend
  4. Aşağıdaki kodun çıktısı nedir? (Event loop)OrtaJavaScriptFrontend
  5. this anahtar kelimesi nasıl belirlenir? Arrow function'larda ne değişir?OrtaJavaScriptFrontend
  6. Bir debounce fonksiyonu yazın.ZorJavaScriptFrontend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle