Sobes.tech
Middle

Obyekt var, onun bəzi dəyərləri funksiyalardır. Onun dərin surətdə kopyasını necə etmək olar? Çətinliklər varmı?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də funksiyalarla dərin nüsxə çıxarma vəzifəsi asan deyil, çünki standart metodlar (məsələn, JSON.parse(JSON.stringify(obj))) funksiyaları kopyalamır.

Funksiyaları saxlayaraq dərin nüsxə çıxarmaq üçün, obyekt üzərində rekursiv keçid və hər bir xüsusiyyəti kopyalamaq mümkündür:

function deepClone(obj) {
  if (obj === null || typeof obj !== 'object') {
    return obj; // Primitivlər və funksiyalar olduğu kimi qaytarılır
  }

  if (typeof obj === 'function') {
    return obj.bind({}); // Sadəcə funksiyanı qaytarmaq və ya bağlama yaratmaq olar
  }

  if (Array.isArray(obj)) {
    return obj.map(deepClone);
  }

  const clonedObj = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      clonedObj[key] = deepClone(obj[key]);
    }
  }
  return clonedObj;
}

Çətinliklər:

  • Funksiyalar referensiya kimi kopyalanır, çünki onların daxili vəziyyəti (bağlamalar) kopyalanmaz.
  • Əgər funksiyalar xarici kontekstdən asılıdırsa, nüsxə fərqli işləyə bilər.
  • Dövr edən referanslar əlavə işləmə tələb edir (məsələn, WeakMap istifadə edilə bilər).

Beləliklə, funksiyalarla dərin kopyalama mümkündür, lakin funksiyalar referensiya kimi kopyalanır və bu nəzərə alınmalıdır.