{"id":31688,"date":"2025-10-12T21:41:00","date_gmt":"2025-10-12T18:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31688"},"modified":"2025-10-12T21:41:00","modified_gmt":"2025-10-12T18:41:00","slug":"javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/","title":{"rendered":"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber<\/h2>\n<p>JavaScript&#8217;te nesnelerle \u00e7al\u0131\u015f\u0131rken, bazen bir nesnenin tamamen ba\u011f\u0131ms\u0131z bir kopyas\u0131na ihtiya\u00e7 duyar\u0131z. Bu, orijinal nesnenin de\u011fi\u015ftirilmeden kalmas\u0131n\u0131 sa\u011flamak, olas\u0131 yan etkileri \u00f6nlemek veya immutability (de\u011fi\u015fmezlik) prensiplerine uymak i\u00e7in kritik \u00f6neme sahiptir. Ancak JavaScript&#8217;te nesneleri kopyalamak, basit bir atama i\u015flemi kadar d\u00fcz de\u011fildir. Bunun nedeni, JavaScript&#8217;in veri t\u00fcrlerini ele al\u0131\u015f bi\u00e7imindeki temel bir ayr\u0131md\u0131r: ilkel (primitive) t\u00fcrler ve referans (reference) t\u00fcrler. Bu makalede, JavaScript&#8217;te nesneleri kopyalaman\u0131n inceliklerini, s\u0131\u011f (shallow) ve derin (deep) kopyalama aras\u0131ndaki farklar\u0131, \u00e7e\u015fitli kopyalama y\u00f6ntemlerini ve her birinin avantajlar\u0131n\u0131, dezavantajlar\u0131n\u0131 ve kullan\u0131m senaryolar\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak inceleyece\u011fiz.<\/p>\n<h3>JavaScript&#8217;te Veri T\u00fcrleri ve Kopyalaman\u0131n Temelleri<\/h3>\n<p>JavaScript&#8217;te kopyalama kavram\u0131n\u0131 anlamak i\u00e7in, ilkel ve referans veri t\u00fcrlerinin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmek esast\u0131r.<\/p>\n<h4>\u0130lkel (Primitive) Veri T\u00fcrleri<\/h4>\n<p><code>string<\/code>, <code>number<\/code>, <code>boolean<\/code>, <code>null<\/code>, <code>undefined<\/code>, <code>symbol<\/code> ve <code>bigint<\/code> gibi ilkel veri t\u00fcrleri, de\u011ferleriyle do\u011frudan bellekte saklan\u0131r. Bir ilkel de\u011feri ba\u015fka bir de\u011fi\u015fkene atad\u0131\u011f\u0131n\u0131zda, o de\u011ferin tam bir kopyas\u0131 olu\u015fturulur.<\/p>\n<pre><code class=\"language-javascript\">let sayi1 = 10;\nlet sayi2 = sayi1; \/\/ sayi1'in de\u011feri olan 10'un bir kopyas\u0131 sayi2'ye atan\u0131r.\n\nsayi2 = 20;\n\nconsole.log(sayi1); \/\/ \u00c7\u0131kt\u0131: 10 (sayi1 de\u011fi\u015fmedi)\nconsole.log(sayi2); \/\/ \u00c7\u0131kt\u0131: 20<\/code><\/pre>\n<p>Burada <code>sayi2<\/code>&#8216;yi de\u011fi\u015ftirmek <code>sayi1<\/code>&#8216;i etkilemez, \u00e7\u00fcnk\u00fc <code>sayi2<\/code> kendi ba\u011f\u0131ms\u0131z 10 kopyas\u0131na sahiptir.<\/p>\n<h4>Referans (Reference) Veri T\u00fcrleri<\/h4>\n<p>Nesneler (<code>Object<\/code>), diziler (<code>Array<\/code>) ve fonksiyonlar (<code>Function<\/code>) gibi referans veri t\u00fcrleri ise do\u011frudan de\u011feri de\u011fil, de\u011ferin bellekteki adresini (referans\u0131n\u0131) tutar. Bir referans t\u00fcr\u00fcn\u00fc ba\u015fka bir de\u011fi\u015fkene atad\u0131\u011f\u0131n\u0131zda, kopyalanan \u015fey nesnenin kendisi de\u011fil, bellekteki adresidir. Bu, her iki de\u011fi\u015fkenin de ayn\u0131 temel nesneyi i\u015faret etti\u011fi anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-javascript\">let nesne1 = { ad: \"Ali\", yas: 30 };\nlet nesne2 = nesne1; \/\/ nesne1'in referans\u0131 (bellek adresi) nesne2'ye atan\u0131r.\n\nnesne2.yas = 31;\n\nconsole.log(nesne1.yas); \/\/ \u00c7\u0131kt\u0131: 31 (nesne1 de de\u011fi\u015fti!)\nconsole.log(nesne2.yas); \/\/ \u00c7\u0131kt\u0131: 31<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>nesne2<\/code>&#8216;nin <code>yas<\/code> \u00f6zelli\u011fini de\u011fi\u015ftirdi\u011fimizde, <code>nesne1<\/code>&#8216;in <code>yas<\/code> \u00f6zelli\u011fi de de\u011fi\u015fir. \u00c7\u00fcnk\u00fc <code>nesne1<\/code> ve <code>nesne2<\/code> asl\u0131nda bellekteki ayn\u0131 nesneyi g\u00f6steren iki farkl\u0131 etikettir. Bu durum, beklenmeyen yan etkilere yol a\u00e7abilir ve \u00f6zellikle b\u00fcy\u00fck uygulamalarda hatalara neden olabilir. Bu nedenle, nesnelerin ba\u011f\u0131ms\u0131z kopyalar\u0131n\u0131 olu\u015fturmak i\u00e7in \u00f6zel y\u00f6ntemlere ihtiya\u00e7 duyar\u0131z. \u0130\u015fte burada s\u0131\u011f ve derin kopyalama devreye girer.<\/p>\n<h3>S\u0131\u011f (Shallow) Kopyalama<\/h3>\n<p>S\u0131\u011f kopyalama, bir nesnenin yaln\u0131zca en \u00fcst d\u00fczeydeki \u00f6zelliklerini kopyalar. E\u011fer nesnenin i\u00e7inde ba\u015fka nesneler (i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler) veya diziler varsa, bu i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar orijinal nesneyle ayn\u0131 referans\u0131 payla\u015fmaya devam eder. Yani, s\u0131\u011f bir kopyan\u0131n i\u00e7indeki bir alt nesneyi de\u011fi\u015ftirirseniz, orijinal nesnedeki kar\u015f\u0131l\u0131k gelen alt nesne de de\u011fi\u015fir.<\/p>\n<p>S\u0131\u011f kopyalama i\u00e7in JavaScript&#8217;te \u00e7e\u015fitli y\u00f6ntemler bulunur:<\/p>\n<h4>1. <code>Object.assign()<\/code><\/h4>\n<p><code>Object.assign()<\/code> metodu, bir veya daha fazla kaynak nesnenin t\u00fcm numaraland\u0131r\u0131labilir kendi \u00f6zelliklerini hedef nesneye kopyalamak i\u00e7in kullan\u0131l\u0131r. \u0130lk arg\u00fcman hedef nesne, di\u011ferleri ise kaynak nesnelerdir. Yeni bir nesne olu\u015fturmak i\u00e7in bo\u015f bir nesneyi hedef olarak kullanabiliriz:<\/p>\n<pre><code class=\"language-javascript\">const orijinalNesne = {\n  a: 1,\n  b: { c: 2 },\n  d: [3, 4]\n};\n\nconst s\u0131\u011fKopya = Object.assign({}, orijinalNesne);\n\nconsole.log(s\u0131\u011fKopya); \/\/ { a: 1, b: { c: 2 }, d: [3, 4] }\n\n\/\/ En \u00fcst d\u00fczey \u00f6zellik de\u011fi\u015fimi\ns\u0131\u011fKopya.a = 10;\nconsole.log(orijinalNesne.a); \/\/ 1 (orijinal de\u011fi\u015fmedi)\nconsole.log(s\u0131\u011fKopya.a);    \/\/ 10\n\n\/\/ \u0130\u00e7 i\u00e7e ge\u00e7mi\u015f nesne de\u011fi\u015fimi (sorun burada ba\u015flar)\ns\u0131\u011fKopya.b.c = 20;\nconsole.log(orijinalNesne.b.c); \/\/ 20 (orijinal de de\u011fi\u015fti!)\nconsole.log(s\u0131\u011fKopya.b.c);    \/\/ 20\n\n\/\/ \u0130\u00e7 i\u00e7e ge\u00e7mi\u015f dizi de\u011fi\u015fimi\ns\u0131\u011fKopya.d.push(5);\nconsole.log(orijinalNesne.d); \/\/ [3, 4, 5] (orijinal de de\u011fi\u015fti!)\nconsole.log(s\u0131\u011fKopya.d);    \/\/ [3, 4, 5]<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>a<\/code> \u00f6zelli\u011fi ilkel bir de\u011fer oldu\u011fu i\u00e7in ba\u011f\u0131ms\u0131z kopyaland\u0131. Ancak <code>b<\/code> ve <code>d<\/code> \u00f6zellikleri referans t\u00fcrleri oldu\u011fu i\u00e7in, <code>s\u0131\u011fKopya<\/code> ve <code>orijinalNesne<\/code> hala ayn\u0131 i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneleri ve dizileri payla\u015f\u0131yorlar.<\/p>\n<h4>2. Spread S\u00f6z Dizimi (<code>...<\/code>)<\/h4>\n<p>ES6 ile birlikte gelen spread s\u00f6z dizimi (yayma operat\u00f6r\u00fc), nesneleri ve dizileri s\u0131\u011f bir \u015fekilde kopyalamak i\u00e7in pop\u00fcler ve k\u0131sa bir yoldur.<\/p>\n<p><strong>Nesneler i\u00e7in:<\/strong><\/p>\n<pre><code class=\"language-javascript\">const orijinalNesne = {\n  a: 1,\n  b: { c: 2 },\n  d: [3, 4]\n};\n\nconst s\u0131\u011fKopya = { ...orijinalNesne };\n\nconsole.log(s\u0131\u011fKopya); \/\/ { a: 1, b: { c: 2 }, d: [3, 4] }\n\n\/\/ Ayn\u0131 Object.assign() \u00f6rne\u011findeki gibi davran\u0131r:\ns\u0131\u011fKopya.a = 10;\ns\u0131\u011fKopya.b.c = 20;\ns\u0131\u011fKopya.d.push(5);\n\nconsole.log(orijinalNesne.a);    \/\/ 1\nconsole.log(orijinalNesne.b.c); \/\/ 20 (de\u011fi\u015fti)\nconsole.log(orijinalNesne.d);    \/\/ [3, 4, 5] (de\u011fi\u015fti)<\/code><\/pre>\n<p><strong>Diziler i\u00e7in:<\/strong><\/p>\n<p>Dizileri kopyalamak i\u00e7in de spread s\u00f6z dizimi kullan\u0131labilir.<\/p>\n<pre><code class=\"language-javascript\">const orijinalDizi = [1, 2, { a: 3 }];\nconst s\u0131\u011fKopyaDizi = [...orijinalDizi];\n\ns\u0131\u011fKopyaDizi[0] = 10;\ns\u0131\u011fKopyaDizi[2].a = 30;\n\nconsole.log(orijinalDizi[0]);    \/\/ 1\nconsole.log(s\u0131\u011fKopyaDizi[0]);    \/\/ 10\nconsole.log(orijinalDizi[2].a); \/\/ 30 (de\u011fi\u015fti)\nconsole.log(s\u0131\u011fKopyaDizi[2].a); \/\/ 30<\/code><\/pre>\n<p>Spread s\u00f6z dizimi, <code>Object.assign()<\/code>&#8216;e g\u00f6re daha okunabilir ve modern bir yakla\u015f\u0131md\u0131r. Ancak s\u0131\u011f kopyalama s\u0131n\u0131rlamalar\u0131 ayn\u0131 \u015fekilde ge\u00e7erlidir.<\/p>\n<h4>3. <code>Array.prototype.slice()<\/code><\/h4>\n<p><code>slice()<\/code> metodu, bir dizinin s\u0131\u011f bir kopyas\u0131n\u0131 olu\u015fturmak i\u00e7in kullan\u0131labilir. Parametre belirtilmezse, t\u00fcm dizinin bir kopyas\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const orijinalDizi = [1, 2, { a: 3 }];\nconst s\u0131\u011fKopyaDizi = orijinalDizi.slice();\n\ns\u0131\u011fKopyaDizi[0] = 10;\ns\u0131\u011fKopyaDizi[2].a = 30;\n\nconsole.log(orijinalDizi[0]);    \/\/ 1\nconsole.log(s\u0131\u011fKopyaDizi[0]);    \/\/ 10\nconsole.log(orijinalDizi[2].a); \/\/ 30 (de\u011fi\u015fti)\nconsole.log(s\u0131\u011fKopyaDizi[2].a); \/\/ 30<\/code><\/pre>\n<p><code>slice()<\/code> da t\u0131pk\u0131 di\u011fer s\u0131\u011f kopyalama y\u00f6ntemleri gibi, i\u00e7 i\u00e7e ge\u00e7mi\u015f referans t\u00fcrlerini kopyalamaz, sadece referanslar\u0131n\u0131 kopyalar.<\/p>\n<h4>4. <code>Array.from()<\/code><\/h4>\n<p><code>Array.from()<\/code> metodu da bir dizi benzeri veya yinelenebilir bir nesneden yeni, s\u0131\u011f kopyalanm\u0131\u015f bir <code>Array<\/code> \u00f6rne\u011fi olu\u015fturur.<\/p>\n<pre><code class=\"language-javascript\">const orijinalDizi = [1, 2, { a: 3 }];\nconst s\u0131\u011fKopyaDizi = Array.from(orijinalDizi);\n\ns\u0131\u011fKopyaDizi[0] = 10;\ns\u0131\u011fKopyaDizi[2].a = 30;\n\nconsole.log(orijinalDizi[0]);    \/\/ 1\nconsole.log(s\u0131\u011fKopyaDizi[0]);    \/\/ 10\nconsole.log(orijinalDizi[2].a); \/\/ 30 (de\u011fi\u015fti)\nconsole.log(s\u0131\u011fKopyaDizi[2].a); \/\/ 30<\/code><\/pre>\n<p><code>Array.from()<\/code> da <code>slice()<\/code> gibi s\u0131\u011f bir kopyalama yapar.<\/p>\n<p><strong>S\u0131\u011f Kopyalaman\u0131n \u00d6zeti:<\/strong><br \/>\nS\u0131\u011f kopyalama, yaln\u0131zca en \u00fcst d\u00fczeydeki ilkel de\u011ferleri ba\u011f\u0131ms\u0131z olarak kopyalar. \u0130\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler veya diziler varsa, bunlar orijinal nesneyle referans olarak payla\u015f\u0131lmaya devam eder. Bu, basit nesneler veya i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar\u0131n\u0131n de\u011fi\u015ftirilmesinin orijinali etkilemesinin sorun olmad\u0131\u011f\u0131 durumlar i\u00e7in uygundur. Ancak \u00e7o\u011fu zaman, tamamen ba\u011f\u0131ms\u0131z bir kopya isteriz. \u0130\u015fte bu noktada derin kopyalama devreye girer.<\/p>\n<h3>Derin (Deep) Kopyalama<\/h3>\n<p>Derin kopyalama, bir nesnenin t\u00fcm \u00f6zelliklerini, i\u00e7 i\u00e7e ge\u00e7mi\u015f t\u00fcm nesneler ve diziler dahil olmak \u00fczere, tamamen ba\u011f\u0131ms\u0131z yeni kopyalar olu\u015fturarak kopyalar. Derin bir kopyan\u0131n herhangi bir b\u00f6l\u00fcm\u00fcn\u00fc de\u011fi\u015ftirmek, orijinal nesnenin hi\u00e7bir b\u00f6l\u00fcm\u00fcn\u00fc etkilemez. Bu, tam ba\u011f\u0131ms\u0131zl\u0131k gerektiren durumlar i\u00e7in idealdir.<\/p>\n<p>Derin kopyalama, s\u0131\u011f kopyalamaya g\u00f6re daha karma\u015f\u0131kt\u0131r ve JavaScript&#8217;te yerle\u015fik, tek bir &#8220;derin kopyala&#8221; fonksiyonu uzun s\u00fcre bulunmam\u0131\u015ft\u0131r (yak\u0131n zamana kadar <code>structuredClone<\/code> gelene kadar).<\/p>\n<h4>1. <code>JSON.parse(JSON.stringify(obj))<\/code><\/h4>\n<p>Bu y\u00f6ntem, derin kopyalama i\u00e7in yayg\u0131n olarak kullan\u0131lan basit bir hiledir. Nesneyi \u00f6nce bir JSON dizesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, ard\u0131ndan bu dizeyi tekrar bir JavaScript nesnesine ayr\u0131\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-javascript\">const orijinalNesne = {\n  a: 1,\n  b: { c: 2, d: { e: 3 } },\n  f: [4, { g: 5 }],\n  h: new Date(),\n  i: undefined,\n  j: function() { console.log('Merhaba'); },\n  k: Symbol('sembol')\n};\n\nconst derinKopya = JSON.parse(JSON.stringify(orijinalNesne));\n\nconsole.log(derinKopya);\n\/*\n\u00c7\u0131kt\u0131:\n{\n  a: 1,\n  b: { c: 2, d: { e: 3 } },\n  f: [4, { g: 5 }],\n  h: \"2023-10-27T10:00:00.000Z\" \/\/ Date objesi stringe d\u00f6n\u00fc\u015ft\u00fc!\n}\n*\/\n\n\/\/ Derin kopyalaman\u0131n avantaj\u0131:\nderinKopya.b.c = 20;\nderinKopya.f[1].g = 50;\n\nconsole.log(orijinalNesne.b.c);    \/\/ 2 (orijinal de\u011fi\u015fmedi)\nconsole.log(derinKopya.b.c);      \/\/ 20\nconsole.log(orijinalNesne.f[1].g); \/\/ 5 (orijinal de\u011fi\u015fmedi)\nconsole.log(derinKopya.f[1].g);   \/\/ 50<\/code><\/pre>\n<p>Bu y\u00f6ntem, basit veri nesneleri i\u00e7in h\u0131zl\u0131 ve etkilidir. Ancak \u00f6nemli s\u0131n\u0131rlamalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Fonksiyonlar\u0131 yok sayar:<\/strong> Nesnedeki fonksiyonlar kopyalanmaz.<br \/>\n*   <strong><code>undefined<\/code> de\u011ferlerini yok sayar:<\/strong> <code>undefined<\/code> de\u011ferleri kopyalanmaz.<br \/>\n*   <strong><code>Symbol<\/code> de\u011ferlerini yok sayar:<\/strong> <code>Symbol<\/code> de\u011ferleri kopyalanmaz.<br \/>\n*   <strong><code>Date<\/code> nesnelerini string&#8217;e d\u00f6n\u00fc\u015ft\u00fcr\u00fcr:<\/strong> <code>Date<\/code> nesneleri, ISO 8601 format\u0131nda bir dizeye d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve orijinal <code>Date<\/code> nesnesi olarak geri al\u0131nmaz.<br \/>\n*   <strong><code>RegExp<\/code> (D\u00fczenli \u0130fade) nesnelerini yok sayar:<\/strong> D\u00fczenli ifade nesneleri kopyalanmaz.<br \/>\n*   <strong><code>Map<\/code>, <code>Set<\/code>, <code>WeakMap<\/code>, <code>WeakSet<\/code> gibi t\u00fcrleri desteklemez:<\/strong> Bu veri yap\u0131lar\u0131 kopyalanmaz veya bo\u015f nesnelere d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<br \/>\n*   <strong>Dairesel referanslar\u0131 (circular references) desteklemez:<\/strong> E\u011fer nesnenin i\u00e7inde kendisine veya \u00fcst d\u00fczey bir atas\u0131na referans veren bir \u00f6zellik varsa, <code>JSON.stringify()<\/code> bir hata (<code>TypeError: Converting circular structure to JSON<\/code>) f\u0131rlat\u0131r.<\/p>\n<p>Bu s\u0131n\u0131rlamalar nedeniyle, <code>JSON.parse(JSON.stringify(obj))<\/code> y\u00f6ntemi, yaln\u0131zca basit, veri odakl\u0131 nesneler ve dairesel referans i\u00e7ermeyen durumlar i\u00e7in uygundur.<\/p>\n<h4>2. <code>structuredClone()<\/code><\/h4>\n<p>Modern JavaScript&#8217;te (taray\u0131c\u0131larda ve Node.js 17+ s\u00fcr\u00fcmlerinde mevcut), HTML Living Standard&#8217;\u0131n bir par\u00e7as\u0131 olan Structured Clone Algorithm&#8217;i uygulayan <code>structuredClone()<\/code> global fonksiyonu, derin kopyalama i\u00e7in en iyi yerle\u015fik \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const orijinalNesne = {\n  a: 1,\n  b: { c: 2, d: { e: 3 } },\n  f: [4, { g: 5 }],\n  h: new Date(),\n  i: undefined, \/\/ undefined kopyalan\u0131r!\n  j: function() { console.log('Merhaba'); }, \/\/ Fonksiyonlar kopyalanmaz\n  k: Symbol('sembol'), \/\/ Semboller kopyalanmaz\n  reg: \/abc\/gi, \/\/ RegExp kopyalan\u0131r\n  map: new Map([['key', 'value']]), \/\/ Map kopyalan\u0131r\n  set: new Set([1, 2, 3]), \/\/ Set kopyalan\u0131r\n};\n\n\/\/ Dairesel referans \u00f6rne\u011fi\norijinalNesne.self = orijinalNesne;\n\ntry {\n  const derinKopya = structuredClone(orijinalNesne);\n\n  console.log(derinKopya);\n  \/*\n  \u00c7\u0131kt\u0131:\n  {\n    a: 1,\n    b: { c: 2, d: { e: 3 } },\n    f: [4, { g: 5 }],\n    h: Date Sun Oct 27 2023..., \/\/ Date objesi do\u011fru kopyaland\u0131\n    i: undefined,               \/\/ undefined do\u011fru kopyaland\u0131\n    reg: \/abc\/gi,               \/\/ RegExp do\u011fru kopyaland\u0131\n    map: Map(1) { 'key' => 'value' }, \/\/ Map do\u011fru kopyaland\u0131\n    set: Set(3) { 1, 2, 3 },      \/\/ Set do\u011fru kopyaland\u0131\n    self: [Circular]            \/\/ Dairesel referans do\u011fru ele al\u0131nd\u0131\n  }\n  *\/\n\n  \/\/ Derin kopyalaman\u0131n avantaj\u0131:\n  derinKopya.b.c = 20;\n  derinKopya.f[1].g = 50;\n  derinKopya.h.setFullYear(2024);\n  derinKopya.map.set('newKey', 'newValue');\n\n  console.log(orijinalNesne.b.c);    \/\/ 2\n  console.log(derinKopya.b.c);      \/\/ 20\n  console.log(orijinalNesne.f[1].g); \/\/ 5\n  console.log(derinKopya.f[1].g);   \/\/ 50\n  console.log(orijinalNesne.h.getFullYear()); \/\/ 2023\n  console.log(derinKopya.h.getFullYear());   \/\/ 2024\n  console.log(orijinalNesne.map.has('newKey')); \/\/ false\n  console.log(derinKopya.map.has('newKey'));   \/\/ true\n\n} catch (e) {\n  console.error(\"Hata:\", e.message);\n}<\/code><\/pre>\n<p><code>structuredClone()<\/code>&#8216;un avantajlar\u0131:<\/p>\n<p>*   <strong>Bir\u00e7ok yerle\u015fik t\u00fcr\u00fc destekler:<\/strong> <code>Date<\/code>, <code>RegExp<\/code>, <code>Map<\/code>, <code>Set<\/code>, <code>ArrayBuffer<\/code>, <code>TypedArray<\/code>, <code>Blob<\/code>, <code>File<\/code>, <code>ImageData<\/code>, <code>Error<\/code> nesneleri ve daha fazlas\u0131n\u0131 do\u011fru bir \u015fekilde kopyalar.<br \/>\n*   <strong>Dairesel referanslar\u0131 ele al\u0131r:<\/strong> Dairesel referanslar i\u00e7eren nesneleri hatas\u0131z kopyalayabilir.<br \/>\n*   <strong><code>undefined<\/code> de\u011ferleri kopyalar.<\/strong><\/p>\n<p>Ancak, <code>structuredClone()<\/code>&#8216;un da baz\u0131 s\u0131n\u0131rlamalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Fonksiyonlar\u0131 kopyalamaz:<\/strong> Fonksiyonlar kopyaland\u0131\u011f\u0131nda at\u0131l\u0131r.<br \/>\n*   <strong><code>Symbol<\/code> de\u011ferlerini kopyalamaz:<\/strong> Semboller kopyaland\u0131\u011f\u0131nda at\u0131l\u0131r.<br \/>\n*   <strong><code>DOM<\/code> d\u00fc\u011f\u00fcmleri gibi baz\u0131 t\u00fcrleri kopyalamaz:<\/strong> Kopyalanmaya \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131nda hata f\u0131rlat\u0131r.<br \/>\n*   <strong>S\u0131n\u0131f \u00f6rneklerini (class instances) tamamen do\u011fru kopyalamaz:<\/strong> S\u0131n\u0131f \u00f6rneklerinin prototip zincirini korumaz, sadece \u00f6zelliklerini kopyalar.<\/p>\n<p>Genel olarak, <code>structuredClone()<\/code> bir\u00e7ok senaryo i\u00e7in en iyi yerle\u015fik derin kopyalama \u00e7\u00f6z\u00fcm\u00fcd\u00fcr.<\/p>\n<h4>3. \u00d6zel Derin Kopyalama Fonksiyonu (Recursive)<\/h4>\n<p>Yukar\u0131daki yerle\u015fik y\u00f6ntemlerin s\u0131n\u0131rlamalar\u0131 nedeniyle, \u00f6zellikle \u00e7ok karma\u015f\u0131k nesnelerle \u00e7al\u0131\u015f\u0131rken veya belirli veri t\u00fcrlerini \u00f6zel olarak ele alman\u0131z gerekti\u011finde kendi derin kopyalama fonksiyonunuzu yazman\u0131z gerekebilir. Bu genellikle \u00f6zyinelemeli (recursive) bir yakla\u015f\u0131m gerektirir.<\/p>\n<p>Basit bir \u00f6zyinelemeli derin kopyalama fonksiyonu \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-javascript\">function derinKopyala(obj, hash = new WeakMap()) {\n  \/\/ Primitive de\u011ferler veya null ise do\u011frudan d\u00f6nd\u00fcr\n  if (obj === null || typeof obj !== 'object') {\n    return obj;\n  }\n\n  \/\/ Dairesel referanslar\u0131 kontrol et\n  if (hash.has(obj)) {\n    return hash.get(obj);\n  }\n\n  \/\/ Tarih ve RegExp nesnelerini \u00f6zel olarak ele al\n  if (obj instanceof Date) {\n    return new Date(obj.getTime());\n  }\n  if (obj instanceof RegExp) {\n    return new RegExp(obj);\n  }\n  \/\/ Di\u011fer yerle\u015fik nesneler (Map, Set vb.) i\u00e7in de benzer kontroller eklenebilir.\n\n  \/\/ Yeni bir nesne veya dizi olu\u015ftur\n  const kopya = Array.isArray(obj) ? [] : {};\n\n  \/\/ Dairesel referanslar\u0131 izlemek i\u00e7in kopyay\u0131 hash'e ekle\n  hash.set(obj, kopya);\n\n  \/\/ \u00d6zellikleri \u00f6zyinelemeli olarak kopyala\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      kopya[key] = derinKopyala(obj[key], hash);\n    }\n  }\n\n  return kopya;\n}\n\nconst orijinalNesne = {\n  ad: \"Ay\u015fe\",\n  bilgiler: {\n    yas: 25,\n    hobiler: [\"kitap\", \"m\u00fczik\", { spor: \"y\u00fczme\" }]\n  },\n  tarih: new Date(),\n  fonk: () => console.log(\"Test\")\n};\n\n\/\/ Dairesel referans olu\u015ftural\u0131m\norijinalNesne.kendisi = orijinalNesne;\n\nconst derinKopya = derinKopyala(orijinalNesne);\n\nconsole.log(derinKopya);\n\nderinKopya.bilgiler.yas = 26;\nderinKopya.bilgiler.hobiler[2].spor = \"ko\u015fu\";\nderinKopya.tarih.setFullYear(2024);\n\nconsole.log(orijinalNesne.bilgiler.yas);      \/\/ 25\nconsole.log(derinKopya.bilgiler.yas);        \/\/ 26\nconsole.log(orijinalNesne.bilgiler.hobiler[2].spor); \/\/ y\u00fczme\nconsole.log(derinKopya.bilgiler.hobiler[2].spor);   \/\/ ko\u015fu\nconsole.log(orijinalNesne.tarih.getFullYear());      \/\/ 2023\nconsole.log(derinKopya.tarih.getFullYear());        \/\/ 2024\nconsole.log(derinKopya.kendisi.bilgiler.yas); \/\/ 26 (dairesel referans do\u011fru kopyaland\u0131)<\/code><\/pre>\n<p>Bu \u00f6zel fonksiyon, <code>Date<\/code> ve <code>RegExp<\/code> gibi baz\u0131 yerle\u015fik nesneleri do\u011fru \u015fekilde ele al\u0131r ve <code>WeakMap<\/code> kullanarak dairesel referanslar\u0131 y\u00f6netir. Ancak, bu fonksiyon hala <code>Symbol<\/code>&#8216;leri veya fonksiyonlar\u0131 do\u011fru \u015fekilde kopyalamaz (fonksiyonlar de\u011fer olarak kopyalan\u0131r, ancak referans olarak de\u011fil, bu da genellikle istenen davran\u0131\u015ft\u0131r). Ayr\u0131ca, <code>Map<\/code>, <code>Set<\/code>, <code>ArrayBuffer<\/code> gibi di\u011fer karma\u015f\u0131k t\u00fcrler i\u00e7in de \u00f6zel mant\u0131k eklenmesi gerekir. Kendi derin kopyalama fonksiyonunuzu yazmak, esneklik sa\u011flar ancak t\u00fcm kenar durumlar\u0131 (edge cases) ele almak olduk\u00e7a karma\u015f\u0131k olabilir.<\/p>\n<h4>4. K\u00fct\u00fcphaneler (\u00d6rn: Lodash <code>_.cloneDeep<\/code>)<\/h4>\n<p>JavaScript ekosisteminde, derin kopyalama gibi karma\u015f\u0131k g\u00f6revleri g\u00fcvenilir ve performansl\u0131 bir \u015fekilde yerine getiren bir\u00e7ok yard\u0131mc\u0131 k\u00fct\u00fcphane bulunmaktad\u0131r. Bunlardan en pop\u00fcler olanlar\u0131ndan biri Lodash&#8217;tir. Lodash&#8217;in <code>_.cloneDeep()<\/code> metodu, neredeyse t\u00fcm veri t\u00fcrlerini, dairesel referanslar\u0131 ve di\u011fer kenar durumlar\u0131 do\u011fru bir \u015fekilde ele alarak sa\u011flam bir derin kopyalama \u00e7\u00f6z\u00fcm\u00fc sunar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ npm install lodash\nimport _ from 'lodash';\n\nconst orijinalNesne = {\n  a: 1,\n  b: { c: 2 },\n  d: [3, { e: 4 }],\n  f: new Date(),\n  g: \/test\/g,\n  h: function() { console.log('Hello'); }\n};\n\n\/\/ Dairesel referans\norijinalNesne.self = orijinalNesne;\n\nconst derinKopya = _.cloneDeep(orijinalNesne);\n\nconsole.log(derinKopya);\n\nderinKopya.b.c = 20;\nderinKopya.d[1].e = 40;\nderinKopya.f.setFullYear(2025);\n\nconsole.log(orijinalNesne.b.c);    \/\/ 2\nconsole.log(derinKopya.b.c);      \/\/ 20\nconsole.log(orijinalNesne.d[1].e); \/\/ 4\nconsole.log(derinKopya.d[1].e);   \/\/ 40\nconsole.log(orijinalNesne.f.getFullYear()); \/\/ 2023\nconsole.log(derinKopya.f.getFullYear());   \/\/ 2025\nconsole.log(derinKopya.self.b.c); \/\/ 20 (dairesel referans do\u011fru ele al\u0131nd\u0131)<\/code><\/pre>\n<p>Lodash <code>_.cloneDeep()<\/code>, <code>Date<\/code>, <code>RegExp<\/code>, <code>Map<\/code>, <code>Set<\/code>, <code>ArrayBuffer<\/code>, <code>TypedArray<\/code> gibi bir\u00e7ok yerle\u015fik nesneyi ve dairesel referanslar\u0131 sorunsuz bir \u015fekilde kopyalar. Fonksiyonlar i\u00e7in ise genellikle referanslar\u0131 kopyalar, \u00e7\u00fcnk\u00fc fonksiyonlar\u0131n kendisinin derin kopyalanmas\u0131 nadiren istenir ve genellikle mant\u0131ks\u0131zd\u0131r. \u00dcretim ortamlar\u0131nda veya karma\u015f\u0131k nesnelerle \u00e7al\u0131\u015f\u0131rken, k\u00fct\u00fcphaneler genellikle en g\u00fcvenli ve en az hataya a\u00e7\u0131k \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h3>Hangi Kopyalama Y\u00f6ntemi Ne Zaman Kullan\u0131lmal\u0131?<\/h3>\n<p>Do\u011fru kopyalama y\u00f6ntemini se\u00e7mek, nesnenizin yap\u0131s\u0131na ve ihtiya\u00e7lar\u0131n\u0131za ba\u011fl\u0131d\u0131r:<\/p>\n<p>*   <strong>S\u0131\u011f Kopyalama (<code>Object.assign()<\/code>, Spread S\u00f6z Dizimi, <code>Array.slice()<\/code>, <code>Array.from()<\/code>):<\/strong><br \/>\n    *   <strong>Ne zaman:<\/strong> Nesnenizin i\u00e7inde i\u00e7 i\u00e7e ge\u00e7mi\u015f nesneler veya diziler yoksa, veya i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar\u0131n orijinal ile ayn\u0131 referans\u0131 payla\u015fmas\u0131 sorun yaratm\u0131yorsa. Genellikle yaln\u0131zca en \u00fcst d\u00fczeyde de\u011fi\u015fiklik yapman\u0131z gerekti\u011finde veya immutability&#8217;yi en \u00fcst d\u00fczeyde koruman\u0131z yeterliyse kullan\u0131l\u0131r.<br \/>\n    *   <strong>\u00d6rnek:<\/strong> Bir React bile\u015feninin <code>state<\/code>&#8216;ini g\u00fcncellerken, yeni bir nesne referans\u0131 olu\u015fturmak ancak alt nesnelerin de\u011fi\u015fmedi\u011fini varsaymak.<\/p>\n<p>*   <strong><code>JSON.parse(JSON.stringify(obj))<\/code>:<\/strong><br \/>\n    *   <strong>Ne zaman:<\/strong> Nesneniz yaln\u0131zca ilkel de\u011ferler, basit nesneler ve dizilerden olu\u015fuyorsa ve <code>Date<\/code> nesneleri, fonksiyonlar, <code>undefined<\/code>, <code>Symbol<\/code> veya dairesel referanslar i\u00e7ermiyorsa. H\u0131zl\u0131 ve basit bir \u00e7\u00f6z\u00fcm ar\u0131yorsan\u0131z.<br \/>\n    *   <strong>\u00d6rnek:<\/strong> API&#8217;den gelen basit bir JSON verisini kopyalamak.<\/p>\n<p>*   <strong><code>structuredClone()<\/code>:<\/strong><br \/>\n    *   <strong>Ne zaman:<\/strong> Modern taray\u0131c\u0131 veya Node.js ortam\u0131nda \u00e7al\u0131\u015f\u0131yorsan\u0131z ve \u00e7o\u011fu yerle\u015fik JavaScript t\u00fcr\u00fcn\u00fc (Date, RegExp, Map, Set vb.) ve dairesel referanslar\u0131 destekleyen g\u00fcvenilir bir yerle\u015fik derin kopyalama \u00e7\u00f6z\u00fcm\u00fcne ihtiyac\u0131n\u0131z varsa. Fonksiyonlar\u0131n veya <code>Symbol<\/code>&#8216;lerin kopyalanmas\u0131na ihtiyac\u0131n\u0131z yoksa.<br \/>\n    *   <strong>\u00d6rnek:<\/strong> Web Worker&#8217;lar aras\u0131nda veri aktar\u0131m\u0131 (burada zaten <code>structuredClone<\/code> kullan\u0131l\u0131r) veya modern bir uygulamada genel ama\u00e7l\u0131 derin kopyalama.<\/p>\n<p>*   <strong>\u00d6zel \u00d6zyinelemeli Derin Kopyalama Fonksiyonu:<\/strong><br \/>\n    *   <strong>Ne zaman:<\/strong> <code>structuredClone()<\/code>&#8216;un desteklemedi\u011fi \u00f6zel t\u00fcrleri (\u00f6rn. belirli s\u0131n\u0131f \u00f6rnekleri, DOM d\u00fc\u011f\u00fcmleri) kopyalaman\u0131z gerekiyorsa veya \u00e7ok \u00f6zel kopyalama mant\u0131\u011f\u0131na ihtiyac\u0131n\u0131z varsa. T\u00fcm kenar durumlar\u0131 kendiniz ele alman\u0131n getirdi\u011fi karma\u015f\u0131kl\u0131\u011f\u0131 ve bak\u0131m y\u00fck\u00fcn\u00fc kabul ediyorsan\u0131z.<br \/>\n    *   <strong>\u00d6rnek:<\/strong> Karma\u015f\u0131k, \u00f6zel s\u0131n\u0131f \u00f6rnekleri i\u00e7eren bir veri modelini kopyalamak.<\/p>\n<p>*   <strong>K\u00fct\u00fcphaneler (\u00d6rn: Lodash <code>_.cloneDeep<\/code>):<\/strong><br \/>\n    *   <strong>Ne zaman:<\/strong> Sa\u011flam, iyi test edilmi\u015f, performansl\u0131 ve t\u00fcm kenar durumlar\u0131 (dairesel referanslar, \u00e7e\u015fitli yerle\u015fik nesne t\u00fcrleri vb.) ele alan bir \u00e7\u00f6z\u00fcme ihtiyac\u0131n\u0131z varsa. \u00d6zellikle karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda en g\u00fcvenilir se\u00e7enektir.<br \/>\n    *   <strong>\u00d6rnek:<\/strong> Karma\u015f\u0131k bir uygulama durumunu (state) kopyalamak, bir veri taban\u0131 modelini klonlamak.<\/p>\n<h3>Immutability (De\u011fi\u015fmezlik) ve Nesne Kopyalama<\/h3>\n<p>JavaScript&#8217;te nesneleri kopyalama konusu, \u00f6zellikle modern \u00f6n u\u00e7 geli\u015ftirme (React, Redux, Vuex gibi k\u00fct\u00fcphanelerle) ba\u011flam\u0131nda immutability (de\u011fi\u015fmezlik) prensibiyle yak\u0131ndan ili\u015fkilidir. De\u011fi\u015fmezlik, bir veri yap\u0131s\u0131 olu\u015fturulduktan sonra de\u011fi\u015ftirilemeyece\u011fi anlam\u0131na gelir. Bunun yerine, bir de\u011fi\u015fiklik gerekti\u011finde, orijinal veri yap\u0131s\u0131n\u0131n de\u011fi\u015ftirilmi\u015f bir kopyas\u0131 olu\u015fturulur.<\/p>\n<p>Immutability&#8217;nin faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Daha tahmin edilebilir kod:<\/strong> Verinin nerede ve ne zaman de\u011fi\u015fti\u011fini takip etmek daha kolayd\u0131r.<br \/>\n*   <strong>Hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r:<\/strong> Yan etkileri azalt\u0131r, hatalar\u0131n kayna\u011f\u0131n\u0131 bulmay\u0131 basitle\u015ftirir.<br \/>\n*   <strong>Performans optimizasyonlar\u0131:<\/strong> De\u011fi\u015fmez verilerle, bir nesnenin de\u011fi\u015fip de\u011fi\u015fmedi\u011fini kontrol etmek i\u00e7in sadece referans kar\u015f\u0131la\u015ft\u0131rmas\u0131 yeterlidir (<code>===<\/code>). Bu, \u00f6zellikle React gibi k\u00fct\u00fcphanelerde gereksiz yeniden render i\u015flemlerini \u00f6nlemek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>E\u015fzamanl\u0131l\u0131k (concurrency) sorunlar\u0131n\u0131 azalt\u0131r:<\/strong> Ayn\u0131 veriye eri\u015fen birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131 veya asenkron i\u015flem oldu\u011funda, verinin de\u011fi\u015fmez olmas\u0131 \u00e7ak\u0131\u015fmalar\u0131 \u00f6nler.<\/p>\n<p>Bu nedenlerle, JavaScript uygulamalar\u0131nda nesneleri kopyalamak, immutability&#8217;yi s\u00fcrd\u00fcrmenin temel bir yoludur. Bir nesneyi do\u011frudan de\u011fi\u015ftirmek yerine, onun s\u0131\u011f veya derin bir kopyas\u0131n\u0131 olu\u015fturup bu kopya \u00fczerinde de\u011fi\u015fiklik yapmak, uygulaman\u0131n durumunu daha g\u00fcvenli ve y\u00f6netilebilir hale getirir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>JavaScript&#8217;te nesneleri kopyalama, ilk bak\u0131\u015fta basit g\u00f6r\u00fcnse de, ilkel ve referans t\u00fcrleri aras\u0131ndaki farklar nedeniyle \u00f6nemli inceliklere sahiptir. S\u0131\u011f kopyalama, yaln\u0131zca en \u00fcst d\u00fczeydeki \u00f6zellikleri ba\u011f\u0131ms\u0131z hale getirirken, i\u00e7 i\u00e7e ge\u00e7mi\u015f referans t\u00fcrlerini orijinal ile payla\u015fmaya devam eder. Derin kopyalama ise nesnenin t\u00fcm yap\u0131s\u0131n\u0131, i\u00e7 i\u00e7e ge\u00e7mi\u015f t\u00fcm bile\u015fenleri dahil olmak \u00fczere tamamen ba\u011f\u0131ms\u0131z hale getirir.<\/p>\n<p><code>Object.assign()<\/code> ve spread s\u00f6z dizimi gibi y\u00f6ntemler s\u0131\u011f kopyalama i\u00e7in pratik \u00e7\u00f6z\u00fcmler sunarken, <code>JSON.parse(JSON.stringify())<\/code> veya daha modern <code>structuredClone()<\/code> gibi y\u00f6ntemler derin kopyalama i\u00e7in farkl\u0131 avantaj ve dezavantajlara sahiptir. Karma\u015f\u0131k senaryolarda veya t\u00fcm kenar durumlar\u0131 kapsayan bir \u00e7\u00f6z\u00fcm aray\u0131\u015f\u0131nda, Lodash gibi k\u00fct\u00fcphanelerin <code>_.cloneDeep()<\/code> fonksiyonu gibi sa\u011flam ve test edilmi\u015f \u00e7\u00f6z\u00fcmlere ba\u015fvurmak en do\u011frusudur.<\/p>\n<p>Uygulaman\u0131z\u0131n gereksinimlerine, nesnelerinizin karma\u015f\u0131kl\u0131\u011f\u0131na ve performans beklentilerinize g\u00f6re do\u011fru kopyalama y\u00f6ntemini se\u00e7mek, daha g\u00fcvenilir, bak\u0131m\u0131 kolay ve tahmin edilebilir JavaScript kodu yazman\u0131n anahtar\u0131d\u0131r. Immutability prensiplerini benimsemek, bu kopyalama tekniklerini etkili bir \u015fekilde kullanmay\u0131 gerektiren modern geli\u015ftirme yakla\u015f\u0131mlar\u0131n\u0131n temelini olu\u015fturur. Bu konudaki derinlemesine bilgi, her JavaScript geli\u015ftiricisinin ara\u00e7 setinde bulunmas\u0131 gereken kritik bir beceridir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber\nJavaScript&#8217;te nesnelerle \u00e7al\u0131\u015f\u0131rken, bazen bir nesnenin tamamen ba\u011f\u0131ms\u0131z bir kopya","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-31688","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript&#039;te Nesneleri Kopyalama: Derinlemesine Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript&#039;te Nesneleri Kopyalama: Derinlemesine Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"JavaScript&#039;te Nesneleri Kopyalama: Derinlemesine Bir Rehber JavaScript&#039;te nesnelerle \u00e7al\u0131\u015f\u0131rken, bazen bir nesnenin tamamen ba\u011f\u0131ms\u0131z bir kopya\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-12T18:41:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber\",\"datePublished\":\"2025-10-12T18:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\"},\"wordCount\":2290,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\",\"name\":\"JavaScript'te Nesneleri Kopyalama: Derinlemesine Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-12T18:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript'te Nesneleri Kopyalama: Derinlemesine Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript'te Nesneleri Kopyalama: Derinlemesine Bir Rehber","og_description":"JavaScript'te Nesneleri Kopyalama: Derinlemesine Bir Rehber JavaScript'te nesnelerle \u00e7al\u0131\u015f\u0131rken, bazen bir nesnenin tamamen ba\u011f\u0131ms\u0131z bir kopya","og_url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-12T18:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber","datePublished":"2025-10-12T18:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/"},"wordCount":2290,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/","name":"JavaScript'te Nesneleri Kopyalama: Derinlemesine Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-12T18:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascriptte-nesneleri-kopyalama-derinlemesine-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript&#8217;te Nesneleri Kopyalama: Derinlemesine Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31688","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31688"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31688\/revisions"}],"predecessor-version":[{"id":31689,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31688\/revisions\/31689"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31688"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31688"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31688"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}