{"id":31731,"date":"2025-10-13T09:41:04","date_gmt":"2025-10-13T06:41:04","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31731"},"modified":"2025-10-13T09:41:04","modified_gmt":"2025-10-13T06:41:04","slug":"ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/","title":{"rendered":"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi"},"content":{"rendered":"<p><body><\/p>\n<h2>ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>JavaScript, web geli\u015ftirmenin temel ta\u015f\u0131 olmaya devam ederken, ECMAScript standartlar\u0131 da dilin s\u00fcrekli evrimini sa\u011flamak i\u00e7in her y\u0131l yeni \u00f6zellikler ve iyile\u015ftirmeler sunar. ECMAScript 2019 (genellikle ES2019 veya ES10 olarak an\u0131l\u0131r), dile b\u00fcy\u00fck devrim niteli\u011finde de\u011fi\u015fiklikler getirmese de, geli\u015ftiricilerin g\u00fcnl\u00fck i\u015flerini kolayla\u015ft\u0131ran, kodun okunabilirli\u011fini art\u0131ran ve dilin daha sa\u011flam hale gelmesini sa\u011flayan bir dizi kullan\u0131\u015fl\u0131 \u00f6zellik sunmu\u015ftur. Bu s\u00fcr\u00fcm, \u00f6zellikle veri i\u015fleme ve dize manip\u00fclasyonu alanlar\u0131nda pratik geli\u015ftirmeler getirirken, baz\u0131 mevcut davran\u0131\u015flar\u0131 da standartla\u015ft\u0131rarak taray\u0131c\u0131lar aras\u0131 tutarl\u0131l\u0131\u011f\u0131 art\u0131rm\u0131\u015ft\u0131r.<\/p>\n<p>Bu makalede, ES2019 ile birlikte gelen temel yenilikleri detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Her bir \u00f6zelli\u011fin ne i\u015fe yarad\u0131\u011f\u0131n\u0131, neden \u00f6nemli oldu\u011funu ve nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 \u00f6rnek kodlarla a\u00e7\u0131klayarak, JavaScript geli\u015ftiricilerinin bu yeni ara\u00e7lar\u0131 kendi projelerinde nas\u0131l etkin bir \u015fekilde kullanabileceklerine dair kapsaml\u0131 bir rehber sunmay\u0131 ama\u00e7l\u0131yoruz. Dizilerle \u00e7al\u0131\u015fmay\u0131 kolayla\u015ft\u0131ran <code>flat()<\/code> ve <code>flatMap()<\/code>, nesne d\u00f6n\u00fc\u015f\u00fcmlerini basitle\u015ftiren <code>Object.fromEntries()<\/code>, dize temizli\u011fini iyile\u015ftiren <code>trimStart()<\/code> ve <code>trimEnd()<\/code>, hata yakalama mekanizmalar\u0131nda esneklik sa\u011flayan opsiyonel <code>catch<\/code> ba\u011flam\u0131 ve daha bir\u00e7ok yenilik, ES2019&#8217;un getirdi\u011fi ba\u015fl\u0131ca geli\u015ftirmeler aras\u0131nda yer almaktad\u0131r. Bu \u00f6zellikler, JavaScript kodunu daha modern, verimli ve hatas\u0131z hale getirme yolunda \u00f6nemli ad\u0131mlard\u0131r.<\/p>\n<h3>Array.prototype.flat()<\/h3>\n<p><code>Array.prototype.flat()<\/code> metodu, i\u00e7 i\u00e7e ge\u00e7mi\u015f (nested) dizileri belirtilen bir derinli\u011fe kadar d\u00fczle\u015ftirerek tek boyutlu bir diziye d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Bu \u00f6zellik, \u00f6zellikle karma\u015f\u0131k veri yap\u0131lar\u0131yla \u00e7al\u0131\u015f\u0131rken dizileri i\u015fleme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde basitle\u015ftirir. Daha \u00f6nce bu t\u00fcr bir i\u015flem i\u00e7in genellikle <code>reduce()<\/code> veya d\u00f6ng\u00fclerle manuel uygulamalar yazmak gerekiyordu, ki bu da kodun daha uzun ve okunmas\u0131 daha zor olmas\u0131na neden oluyordu.<\/p>\n<p><code>flat()<\/code> metodu, iste\u011fe ba\u011fl\u0131 olarak bir <code>depth<\/code> (derinlik) arg\u00fcman\u0131 al\u0131r. Bu arg\u00fcman, i\u00e7 i\u00e7e ge\u00e7me seviyesini belirtir. Varsay\u0131lan olarak, <code>depth<\/code> de\u011feri <code>1<\/code>&#8216;dir, yani dizi yaln\u0131zca bir seviye d\u00fczle\u015ftirilir. E\u011fer daha derin seviyelerdeki i\u00e7 i\u00e7e ge\u00e7mi\u015f dizilerin de d\u00fczle\u015ftirilmesi isteniyorsa, <code>depth<\/code> arg\u00fcman\u0131na daha b\u00fcy\u00fck bir say\u0131 veya t\u00fcm seviyeleri d\u00fczle\u015ftirmek i\u00e7in <code>Infinity<\/code> de\u011feri verilebilir.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Bir API&#8217;den gelen i\u00e7 i\u00e7e ge\u00e7mi\u015f veri yap\u0131lar\u0131n\u0131 daha kolay i\u015flenebilir hale getirmek.<br \/>\n*   Birden fazla kaynaktan gelen dizileri tek bir listede birle\u015ftirmek.<br \/>\n*   A\u011fa\u00e7 benzeri yap\u0131lardan elde edilen verileri liste format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Varsay\u0131lan derinlik (1) ile d\u00fczle\u015ftirme\nconst arr1 = [1, 2, [3, 4]];\nconsole.log(arr1.flat()); \/\/ [1, 2, 3, 4]\n\n\/\/ Daha derin bir diziyi varsay\u0131lan derinlikle d\u00fczle\u015ftirme\nconst arr2 = [1, [2, [3, 4], 5], 6];\nconsole.log(arr2.flat()); \/\/ [1, 2, [3, 4], 5, 6] - Sadece ilk seviye d\u00fczle\u015ftirildi\n\n\/\/ Belirli bir derinlikle d\u00fczle\u015ftirme\nconsole.log(arr2.flat(2)); \/\/ [1, 2, 3, 4, 5, 6] - \u0130kinci seviyeye kadar d\u00fczle\u015ftirildi\n\n\/\/ T\u00fcm seviyeleri d\u00fczle\u015ftirme\nconst arr3 = [1, [2, [3, [4, 5], 6], 7], 8];\nconsole.log(arr3.flat(Infinity)); \/\/ [1, 2, 3, 4, 5, 6, 7, 8]\n\n\/\/ Bo\u015fluklar\u0131 olan dizilerde bo\u015fluklar\u0131 kald\u0131rma\nconst arr4 = [1, , 3, [4, 5]];\nconsole.log(arr4.flat()); \/\/ [1, 3, 4, 5] - Bo\u015f elemanlar otomatik olarak kald\u0131r\u0131l\u0131r<\/code><\/pre>\n<p><code>flat()<\/code> metodu, JavaScript&#8217;te veri manip\u00fclasyonunu \u00e7ok daha sezgisel ve temiz hale getiren, uzun zamand\u0131r beklenen bir eklentidir.<\/p>\n<h3>Array.prototype.flatMap()<\/h3>\n<p><code>Array.prototype.flatMap()<\/code> metodu, <code>map()<\/code> metodunun her bir eleman \u00fczerinde bir fonksiyon uygulay\u0131p yeni bir dizi d\u00f6nd\u00fcrmesi ile <code>flat()<\/code> metodunun bu yeni diziyi tek bir seviye d\u00fczle\u015ftirmesinin birle\u015fimidir. Yani, \u00f6nce dizideki her eleman \u00fczerinde bir d\u00f6n\u00fc\u015ft\u00fcrme i\u015flemi yapar, ard\u0131ndan \u00e7\u0131kan sonu\u00e7lar\u0131 tek bir diziye d\u00fczle\u015ftirir. Bu, iki ayr\u0131 i\u015flem yerine tek bir metod \u00e7a\u011fr\u0131s\u0131 ile ayn\u0131 sonucu elde etmeyi sa\u011flar, bu da kodu daha k\u0131sa ve okunabilir hale getirir. <code>flatMap()<\/code> metodu, varsay\u0131lan olarak yaln\u0131zca bir seviye d\u00fczle\u015ftirme yapar ve <code>depth<\/code> arg\u00fcman\u0131 almaz.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Dizideki her eleman\u0131 d\u00f6n\u00fc\u015ft\u00fcr\u00fcp sonu\u00e7 olarak s\u0131f\u0131r veya daha fazla eleman i\u00e7eren bir dizi d\u00f6nd\u00fcrmek ve bu sonu\u00e7lar\u0131 tek bir dizide birle\u015ftirmek.<br \/>\n*   Stringleri kelimelerine ay\u0131r\u0131p tek bir kelime listesi olu\u015fturmak.<br \/>\n*   Filtreleme ve d\u00f6n\u00fc\u015ft\u00fcrme i\u015flemlerini tek ad\u0131mda yapmak (\u00f6rne\u011fin, ge\u00e7ersiz elemanlar\u0131 atlay\u0131p ge\u00e7erli olanlar\u0131 d\u00f6n\u00fc\u015ft\u00fcrmek).<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Her say\u0131y\u0131 ve bir sonraki say\u0131y\u0131 i\u00e7eren bir dizi olu\u015fturma\nconst numbers = [1, 2, 3];\nconst result1 = numbers.flatMap(num => [num, num * 2]);\nconsole.log(result1); \/\/ [1, 2, 2, 4, 3, 6]\n\n\/\/ <code>map<\/code> ve <code>flat<\/code> ile ayn\u0131 sonucu elde etme\nconst result1_manual = numbers.map(num => [num, num * 2]).flat();\nconsole.log(result1_manual); \/\/ [1, 2, 2, 4, 3, 6]\n\n\/\/ Stringleri kelimelere ay\u0131rma ve tek bir diziye d\u00fczle\u015ftirme\nconst sentences = [\"Merhaba d\u00fcnya\", \"JavaScript \u00f6\u011freniyorum\"];\nconst words = sentences.flatMap(sentence => sentence.split(\" \"));\nconsole.log(words); \/\/ [\"Merhaba\", \"d\u00fcnya\", \"JavaScript\", \"\u00f6\u011freniyorum\"]\n\n\/\/ Ko\u015fullu d\u00f6n\u00fc\u015ft\u00fcrme ve d\u00fczle\u015ftirme\nconst products = [\n  { name: \"Laptop\", tags: [\"elektronik\", \"teknoloji\"] },\n  { name: \"Kitap\", tags: [\"e\u011fitim\"] },\n  { name: \"Telefon\", tags: [\"elektronik\", \"mobil\"] },\n];\n\/\/ Sadece \"elektronik\" etiketine sahip \u00fcr\u00fcnlerin etiketlerini listeleyelim\nconst electronicTags = products.flatMap(product =>\n  product.tags.includes(\"elektronik\") ? product.tags : []\n);\nconsole.log(electronicTags); \/\/ [\"elektronik\", \"teknoloji\", \"elektronik\", \"mobil\"]<\/code><\/pre>\n<p><code>flatMap()<\/code> metodu, \u00f6zellikle diziler \u00fczerinde d\u00f6n\u00fc\u015f\u00fcm ve birle\u015ftirme i\u015flemlerini s\u0131k\u00e7a yapan geli\u015ftiriciler i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Kodun daha k\u0131sa, daha okunabilir ve daha az hata yapmaya a\u00e7\u0131k olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Object.fromEntries()<\/h3>\n<p><code>Object.fromEntries()<\/code> metodu, ES2019&#8217;un getirdi\u011fi \u00f6nemli ve kullan\u0131\u015fl\u0131 yeniliklerden biridir. Bu metot, <code>Object.entries()<\/code> metodunun tam tersi bir i\u015flevi g\u00f6r\u00fcr. <code>Object.entries()<\/code> bir nesneyi anahtar-de\u011fer \u00e7iftlerinden olu\u015fan bir diziye d\u00f6n\u00fc\u015ft\u00fcr\u00fcrken, <code>Object.fromEntries()<\/code> bu anahtar-de\u011fer \u00e7iftlerinden olu\u015fan bir diziyi (veya herhangi bir iterable&#8217;\u0131) tekrar bir JavaScript nesnesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p>Bu \u00f6zellik, \u00f6zellikle <code>Map<\/code> objeleriyle veya <code>Object.entries()<\/code> ile elde edilen veri setleriyle \u00e7al\u0131\u015f\u0131rken \u00e7ok pratik bir kullan\u0131m sunar. \u00d6rne\u011fin, bir nesneyi al\u0131p \u00fczerinde <code>map()<\/code> veya <code>filter()<\/code> gibi dizi metodlar\u0131n\u0131 kullanarak de\u011fi\u015fiklikler yapmak istedi\u011finizde, \u00f6nce <code>Object.entries()<\/code> ile diziye d\u00f6n\u00fc\u015ft\u00fcr\u00fcp, i\u015flemleri tamamlad\u0131ktan sonra <code>Object.fromEntries()<\/code> ile tekrar nesneye \u00e7evirebilirsiniz.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   <code>Map<\/code> objelerini do\u011frudan d\u00fcz JavaScript nesnelerine d\u00f6n\u00fc\u015ft\u00fcrmek.<br \/>\n*   Bir nesnenin anahtar-de\u011fer \u00e7iftlerini filtrelemek veya d\u00f6n\u00fc\u015ft\u00fcrmek ve sonucu tekrar bir nesne olarak elde etmek.<br \/>\n*   URL sorgu dizelerinden (query strings) elde edilen anahtar-de\u011fer \u00e7iftlerini nesneye d\u00f6n\u00fc\u015ft\u00fcrmek.<br \/>\n*   HTTP ba\u015fl\u0131klar\u0131n\u0131 (headers) veya form verilerini i\u015flemek.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ <code>Object.entries()<\/code> ile olu\u015fturulmu\u015f bir diziden nesne olu\u015fturma\nconst entries = [['a', 1], ['b', 2], ['c', 3]];\nconst obj1 = Object.fromEntries(entries);\nconsole.log(obj1); \/\/ { a: 1, b: 2, c: 3 }\n\n\/\/ <code>Map<\/code> objesinden nesne olu\u015fturma\nconst map = new Map([['name', 'Alice'], ['age', 30]]);\nconst obj2 = Object.fromEntries(map);\nconsole.log(obj2); \/\/ { name: 'Alice', age: 30 }\n\n\/\/ Bir nesneyi d\u00f6n\u00fc\u015ft\u00fcrme ve filtreleme \u00f6rne\u011fi\nconst user = {\n  name: 'John Doe',\n  age: 28,\n  city: 'New York',\n  occupation: 'Developer'\n};\n\n\/\/ Sadece 'name' ve 'age' alanlar\u0131n\u0131 i\u00e7eren yeni bir nesne olu\u015fturma\nconst filteredUser = Object.fromEntries(\n  Object.entries(user).filter(([key, value]) => key === 'name' || key === 'age')\n);\nconsole.log(filteredUser); \/\/ { name: 'John Doe', age: 28 }\n\n\/\/ URL sorgu dizelerini (query string) nesneye d\u00f6n\u00fc\u015ft\u00fcrme (basit bir \u00f6rnek)\nconst queryString = '?param1=value1&param2=value2';\nconst params = Object.fromEntries(\n  queryString.substring(1).split('&').map(pair => pair.split('='))\n);\nconsole.log(params); \/\/ { param1: 'value1', param2: 'value2' }<\/code><\/pre>\n<p><code>Object.fromEntries()<\/code> metodu, JavaScript&#8217;te veri manip\u00fclasyonu i\u00e7in eksik olan bir par\u00e7ay\u0131 tamamlayarak, nesneler ve diziler aras\u0131nda daha ak\u0131c\u0131 ve i\u015flevsel bir ge\u00e7i\u015f sa\u011flamaktad\u0131r. Bu, \u00f6zellikle modern JavaScript uygulamalar\u0131nda veri i\u015fleme s\u00fcre\u00e7lerini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<h3>String.prototype.trimStart() ve String.prototype.trimEnd()<\/h3>\n<p>ES2019, dizelerin ba\u015f\u0131ndaki ve sonundaki bo\u015fluk karakterlerini kald\u0131rmak i\u00e7in iki yeni metot sunmu\u015ftur: <code>String.prototype.trimStart()<\/code> ve <code>String.prototype.trimEnd()<\/code>. Bu metotlar, zaten var olan <code>String.prototype.trim()<\/code> metodunun daha spesifik versiyonlar\u0131d\u0131r. <code>trim()<\/code> metodu hem ba\u015ftaki hem de sondaki bo\u015fluklar\u0131 kald\u0131r\u0131rken, <code>trimStart()<\/code> sadece ba\u015ftaki bo\u015fluklar\u0131, <code>trimEnd()<\/code> ise sadece sondaki bo\u015fluklar\u0131 kald\u0131r\u0131r.<\/p>\n<p>Bu metotlar, dize manip\u00fclasyonunda daha ince ayar yapma imkan\u0131 sunar ve \u00f6zellikle kullan\u0131c\u0131 giri\u015flerini temizlerken veya belirli formatlardaki metinleri i\u015flerken olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. Bu bo\u015fluk karakterleri, bo\u015fluk (space), tab (<code>\\t<\/code>), yeni sat\u0131r (<code>\\n<\/code>), sat\u0131r ba\u015f\u0131 (<code>\\r<\/code>) gibi Unicode bo\u015fluk karakterlerini i\u00e7erir.<\/p>\n<p><strong>Takma Adlar (Aliases):<\/strong><br \/>\nBu metotlar i\u00e7in eski taray\u0131c\u0131 uyumlulu\u011fu veya di\u011fer standartlarla uyum sa\u011flamak amac\u0131yla takma adlar da tan\u0131mlanm\u0131\u015ft\u0131r:<br \/>\n*   <code>String.prototype.trimLeft()<\/code>: <code>trimStart()<\/code>&#8216;\u0131n takma ad\u0131d\u0131r.<br \/>\n*   <code>String.prototype.trimRight()<\/code>: <code>trimEnd()<\/code>&#8216;in takma ad\u0131d\u0131r.<br \/>\nFonksiyonel olarak tamamen ayn\u0131d\u0131rlar. Yeni kod yazarken <code>trimStart()<\/code> ve <code>trimEnd()<\/code> kullan\u0131lmas\u0131 tavsiye edilir, ancak eski kod tabanlar\u0131nda veya belirli ortamlarda takma adlar\u0131 g\u00f6rmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Kullan\u0131c\u0131dan al\u0131nan input verilerinin ba\u015f\u0131nda veya sonunda istenmeyen bo\u015fluklar\u0131 temizlemek.<br \/>\n*   Dosya yollar\u0131n\u0131 veya URL&#8217;leri i\u015flerken fazladan bo\u015fluklar\u0131 kald\u0131rmak.<br \/>\n*   Metin ayr\u0131\u015ft\u0131rma (parsing) i\u015flemlerinde tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">const text1 = \"   Merhaba D\u00fcnya!   \";\n\n\/\/ trimStart() - Sadece ba\u015ftaki bo\u015fluklar\u0131 kald\u0131r\u0131r\nconsole.log(<code>'${text1.trimStart()}'<\/code>); \/\/ 'Merhaba D\u00fcnya!   '\n\n\/\/ trimEnd() - Sadece sondaki bo\u015fluklar\u0131 kald\u0131r\u0131r\nconsole.log(<code>'${text1.trimEnd()}'<\/code>);   \/\/ '   Merhaba D\u00fcnya!'\n\n\/\/ trim() - Hem ba\u015ftaki hem sondaki bo\u015fluklar\u0131 kald\u0131r\u0131r (mevcut metot)\nconsole.log(<code>'${text1.trim()}'<\/code>);     \/\/ 'Merhaba D\u00fcnya!'\n\nconst text2 = \"\\t\\n  JavaScript  \\r\\n\";\n\n\/\/ trimStart() farkl\u0131 bo\u015fluk karakterlerini de temizler\nconsole.log(<code>'${text2.trimStart()}'<\/code>); \/\/ 'JavaScript  \\r\\n'\n\n\/\/ trimEnd() farkl\u0131 bo\u015fluk karakterlerini de temizler\nconsole.log(<code>'${text2.trimEnd()}'<\/code>);   \/\/ '\\t\\n  JavaScript'\n\n\/\/ trimLeft() ve trimRight() takma adlar\u0131\nconsole.log(<code>'${text1.trimLeft()}'<\/code>);  \/\/ 'Merhaba D\u00fcnya!   '\nconsole.log(<code>'${text1.trimRight()}'<\/code>); \/\/ '   Merhaba D\u00fcnya!'<\/code><\/pre>\n<p>Bu yeni metotlar, dize manip\u00fclasyonu i\u00e7in daha esnek ve okunabilir \u00e7\u00f6z\u00fcmler sunarak geli\u015ftiricilerin i\u015fini kolayla\u015ft\u0131rmaktad\u0131r.<\/p>\n<h3>Symbol.prototype.description<\/h3>\n<p><code>Symbol<\/code> tipi, ES6 (ES2015) ile birlikte JavaScript&#8217;e eklenen benzersiz ve de\u011fi\u015fmez de\u011ferler olu\u015fturmak i\u00e7in kullan\u0131lan ilkel bir veri t\u00fcr\u00fcd\u00fcr. Bir <code>Symbol<\/code> olu\u015ftururken, iste\u011fe ba\u011fl\u0131 olarak bir a\u00e7\u0131klama (description) dizesi verilebilir. Bu a\u00e7\u0131klama, sembol\u00fcn amac\u0131n\u0131 belirtmek ve hata ay\u0131klama s\u00fcre\u00e7lerinde yard\u0131mc\u0131 olmak i\u00e7in kullan\u0131l\u0131r. ES2019&#8217;dan \u00f6nce, bir sembol\u00fcn a\u00e7\u0131klamas\u0131na do\u011frudan eri\u015fmenin standart bir yolu yoktu; genellikle <code>Symbol.prototype.toString()<\/code> metodunu \u00e7a\u011f\u0131r\u0131p \u00e7\u0131kan dizeden a\u00e7\u0131klamay\u0131 ayr\u0131\u015ft\u0131rmak gerekiyordu.<\/p>\n<p>ES2019 ile birlikte, <code>Symbol.prototype.description<\/code> \u00f6zelli\u011fi eklenmi\u015ftir. Bu \u00f6zellik, bir <code>Symbol<\/code> de\u011ferinin a\u00e7\u0131klama dizesine do\u011frudan eri\u015fim sa\u011flar. Bu sayede, sembollerin hata ay\u0131klama ve loglama s\u00fcre\u00e7lerinde daha anlaml\u0131 hale gelmesi sa\u011flanm\u0131\u015ft\u0131r.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Hata ay\u0131klama (debugging) s\u0131ras\u0131nda sembollerin neyi temsil etti\u011fini kolayca anlamak.<br \/>\n*   Loglama sistemlerinde sembollerin a\u00e7\u0131klamalar\u0131n\u0131 g\u00f6stermek.<br \/>\n*   Geli\u015ftirici ara\u00e7lar\u0131nda sembol bilgilerini daha anla\u015f\u0131l\u0131r bir \u015fekilde sunmak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ A\u00e7\u0131klamal\u0131 bir sembol olu\u015fturma\nconst mySymbol = Symbol('Bu bir sembol a\u00e7\u0131klamas\u0131d\u0131r');\nconsole.log(mySymbol); \/\/ Symbol(Bu bir sembol a\u00e7\u0131klamas\u0131d\u0131r)\n\n\/\/ description \u00f6zelli\u011fine eri\u015fim\nconsole.log(mySymbol.description); \/\/ \"Bu bir sembol a\u00e7\u0131klamas\u0131d\u0131r\"\n\n\/\/ A\u00e7\u0131klamas\u0131z bir sembol olu\u015fturma\nconst anotherSymbol = Symbol();\nconsole.log(anotherSymbol); \/\/ Symbol()\n\n\/\/ A\u00e7\u0131klamas\u0131z sembol\u00fcn description \u00f6zelli\u011fi\nconsole.log(anotherSymbol.description); \/\/ undefined\n\n\/\/ toString() ile kar\u015f\u0131la\u015ft\u0131rma\nconsole.log(mySymbol.toString()); \/\/ \"Symbol(Bu bir sembol a\u00e7\u0131klamas\u0131d\u0131r)\"\n\/\/ mySymbol.description, toString() sonucunu ayr\u0131\u015ft\u0131rmaya gerek kalmadan do\u011frudan a\u00e7\u0131klamay\u0131 verir.<\/code><\/pre>\n<p><code>Symbol.prototype.description<\/code>, <code>Symbol<\/code>&#8216;lerle \u00e7al\u0131\u015fmay\u0131 daha pratik ve hata ay\u0131klama dostu hale getirerek, geli\u015ftiricilere sembollerin amac\u0131n\u0131 daha kolay anlama imkan\u0131 sunar. Bu k\u00fc\u00e7\u00fck ama etkili ekleme, dilin daha ergonomik olmas\u0131na katk\u0131da bulunur.<\/p>\n<h3>Opsiyonel Catch Ba\u011flam\u0131 (Optional Catch Binding)<\/h3>\n<p>ES2019&#8217;dan \u00f6nce, bir <code>try...catch<\/code> blo\u011fu kullan\u0131ld\u0131\u011f\u0131nda, <code>catch<\/code> ifadesinin parantez i\u00e7inde bir hata de\u011fi\u015fkeni (catch binding) belirtmesi zorunluydu. \u00d6rne\u011fin: <code>catch (error) { ... }<\/code>. Ancak, baz\u0131 durumlarda yakalanan hatan\u0131n detaylar\u0131na ihtiya\u00e7 duyulmaz, sadece bir hata olu\u015ftu\u011fu bilgisi yeterli olur. \u00d6rne\u011fin, belirli bir i\u015flemi denemek ve ba\u015far\u0131s\u0131z olursa sessizce devam etmek gibi senaryolarda hata de\u011fi\u015fkeni kullan\u0131lmaz. Bu durumlarda bile bir hata de\u011fi\u015fkeni tan\u0131mlamak, kodu gereksiz yere kalabal\u0131kla\u015ft\u0131r\u0131yordu.<\/p>\n<p>ES2019 ile birlikte, <code>catch<\/code> blo\u011funda hata de\u011fi\u015fkenini belirtme zorunlulu\u011fu kald\u0131r\u0131lm\u0131\u015ft\u0131r. Art\u0131k, hata nesnesine ihtiya\u00e7 duyulmad\u0131\u011f\u0131nda <code>catch<\/code> parantezleri bo\u015f b\u0131rak\u0131labilir: <code>catch { ... }<\/code>. Bu \u00f6zellik, kodun daha temiz ve okunabilir olmas\u0131n\u0131 sa\u011flar, \u00f6zellikle hata detaylar\u0131n\u0131n \u00f6nemsiz oldu\u011fu veya ba\u015fka bir \u015fekilde ele al\u0131nd\u0131\u011f\u0131 durumlarda.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131 durumunda sadece bir log mesaj\u0131 g\u00f6stermek veya UI&#8217;da bir bildirim yapmak gibi basit hata y\u00f6netimi senaryolar\u0131.<br \/>\n*   Baz\u0131 asenkron i\u015flemlerde (\u00f6rne\u011fin, <code>Promise.allSettled<\/code> \u00f6ncesi) belirli bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131n\u0131 beklemek ama hatay\u0131 detayl\u0131 i\u015flememek.<br \/>\n*   Taray\u0131c\u0131 API&#8217;leri gibi belirli ortam \u00f6zelliklerinin varl\u0131\u011f\u0131n\u0131 test ederken hatalar\u0131 sessizce yutmak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ ES2019 \u00f6ncesi (hata de\u011fi\u015fkeni zorunlu)\ntry {\n  \/\/ Hata olu\u015fturabilecek bir i\u015flem\n  JSON.parse(\"invalid json\");\n} catch (error) { \/\/ 'error' de\u011fi\u015fkeni burada kullan\u0131lmasa bile belirtilmeliydi\n  console.log(\"Bir hata olu\u015ftu, ancak detaylara ihtiyac\u0131m\u0131z yok.\");\n}\n\n\/\/ ES2019 sonras\u0131 (hata de\u011fi\u015fkeni opsiyonel)\ntry {\n  \/\/ Hata olu\u015fturabilecek ba\u015fka bir i\u015flem\n  const result = somePotentiallyFailingFunction();\n  console.log(\"\u0130\u015flem ba\u015far\u0131l\u0131:\", result);\n} catch { \/\/ Hata de\u011fi\u015fkeni belirtilmedi\n  console.log(\"\u0130\u015flem ba\u015far\u0131s\u0131z oldu. L\u00fctfen tekrar deneyin.\");\n  \/\/ Hata nesnesine burada do\u011frudan eri\u015filemez.\n}\n\nfunction somePotentiallyFailingFunction() {\n  if (Math.random() > 0.5) {\n    throw new Error(\"Rastgele hata!\");\n  }\n  return \"Ba\u015far\u0131l\u0131 veri\";\n}\n\n\/\/ Hata de\u011fi\u015fkeni yine de kullan\u0131labilir\ntry {\n  \/\/ Hata olu\u015fturabilecek bir i\u015flem\n  throw new Error(\"\u00d6nemli bir hata!\");\n} catch (e) {\n  console.error(\"Detayl\u0131 hata:\", e.message);\n}<\/code><\/pre>\n<p>Opsiyonel <code>catch<\/code> ba\u011flam\u0131, \u00f6zellikle hata nesnesinin i\u00e7eri\u011fine ihtiya\u00e7 duyulmayan senaryolarda kodun daha az karma\u015f\u0131k ve daha odakl\u0131 olmas\u0131n\u0131 sa\u011flayarak geli\u015ftirici deneyimini iyile\u015ftirir.<\/p>\n<h3>JSON.stringify i\u00e7in \u0130yi Bi\u00e7imlendirilmi\u015f Unicode<\/h3>\n<p>ES2019&#8217;dan \u00f6nce <code>JSON.stringify()<\/code> metodu, baz\u0131 Unicode karakterlerini (\u00f6zellikle tek ba\u015f\u0131na vekil \u00e7iftlerini &#8211; lone surrogates) i\u015flerken sorunlar ya\u015fayabiliyordu. Unicode&#8217;da, baz\u0131 nadir karakterler (\u00f6rne\u011fin, emojiler veya eski dillerdeki karakterler) iki adet 16-bitlik birim (surrogate pair) olarak temsil edilir. Ancak, bir vekil \u00e7iftinin sadece bir yar\u0131s\u0131 (lone surrogate) kullan\u0131ld\u0131\u011f\u0131nda, <code>JSON.stringify()<\/code> bu karakterleri do\u011frudan \u00e7\u0131kt\u0131da b\u0131rakarak ge\u00e7erli olmayan JSON dizeleri olu\u015fturabiliyordu. Bu durum, JSON dizelerinin ayr\u0131\u015ft\u0131r\u0131lmas\u0131nda hatalara yol a\u00e7abiliyor ve g\u00fcvenlik a\u00e7\u0131klar\u0131 olu\u015fturabiliyordu, \u00e7\u00fcnk\u00fc baz\u0131 ayr\u0131\u015ft\u0131r\u0131c\u0131lar bu ge\u00e7ersiz dizeleri farkl\u0131 \u015fekillerde yorumlayabilirdi.<\/p>\n<p>ES2019 ile birlikte, <code>JSON.stringify()<\/code> bu t\u00fcr tek ba\u015f\u0131na vekil \u00e7iftlerini otomatik olarak Unicode ka\u00e7\u0131\u015f dizilerine d\u00f6n\u00fc\u015ft\u00fcrerek (\u00f6rne\u011fin <code>\\uD800<\/code>) \u00e7\u0131kt\u0131n\u0131n her zaman iyi bi\u00e7imlendirilmi\u015f ve ge\u00e7erli JSON olmas\u0131n\u0131 sa\u011flar. Bu, uluslararas\u0131la\u015fma (i18n) ve farkl\u0131 dillerdeki metinlerle \u00e7al\u0131\u015fan uygulamalar i\u00e7in \u00f6nemli bir g\u00fcvenlik ve tutarl\u0131l\u0131k geli\u015ftirmesidir.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Uygulamalar aras\u0131nda veya sunucu ile istemci aras\u0131nda g\u00fcvenli ve tutarl\u0131 Unicode veri al\u0131\u015fveri\u015fi.<br \/>\n*   Kullan\u0131c\u0131 taraf\u0131ndan girilen veya d\u0131\u015f kaynaklardan al\u0131nan metin verilerini JSON&#8217;a d\u00f6n\u00fc\u015ft\u00fcr\u00fcrken potansiyel hatalar\u0131 \u00f6nlemek.<br \/>\n*   Uluslararas\u0131 karakter setlerini i\u00e7eren verilerle \u00e7al\u0131\u015f\u0131rken veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Tek ba\u015f\u0131na vekil karakter (lone surrogate)\nconst loneSurrogate = '\\uD800'; \/\/ D800-DBFF aral\u0131\u011f\u0131ndaki bir y\u00fcksek vekil (high surrogate)\n\n\/\/ ES2019 \u00f6ncesi (veya baz\u0131 eski taray\u0131c\u0131larda) bu, do\u011frudan JSON \u00e7\u0131kt\u0131s\u0131na dahil edilerek ge\u00e7ersiz JSON'a neden olabilirdi.\n\/\/ <code>JSON.stringify(loneSurrogate)<\/code> => '\"\\uD800\"' (bu ge\u00e7ersiz JSON'dur)\n\n\/\/ ES2019 sonras\u0131, bu durum d\u00fczeltilmi\u015ftir:\nconsole.log(JSON.stringify(loneSurrogate)); \/\/ '\"\\\\uD800\"'\n\/\/ \u00c7\u0131kt\u0131, vekil karakteri do\u011fru bir \u015fekilde ka\u00e7\u0131\u015f dizisi olarak temsil eder ve ge\u00e7erli JSON olu\u015fturur.\n\n\/\/ Ge\u00e7erli bir vekil \u00e7ifti (emoji \u00f6rne\u011fi)\nconst emoji = ' '; \/\/ Bu, bir vekil \u00e7iftidir: \\uD83D\\uDE00\nconsole.log(JSON.stringify(emoji)); \/\/ '\" \"' veya '\"\\uD83D\\uDE00\"' (taray\u0131c\u0131ya g\u00f6re de\u011fi\u015febilir, ancak her ikisi de ge\u00e7erlidir)\n\/\/ Buradaki \u00f6nemli nokta, tek ba\u015f\u0131na vekil \u00e7iftlerinin do\u011fru i\u015flenmesidir.\n\n\/\/ Kar\u0131\u015f\u0131k metin\nconst textWithSurrogate = 'Merhaba ' + loneSurrogate + ' d\u00fcnya!';\nconsole.log(JSON.stringify(textWithSurrogate)); \/\/ \"Merhaba \\\\uD800 d\u00fcnya!\"<\/code><\/pre>\n<p>Bu d\u00fczeltme, <code>JSON.stringify()<\/code>&#8216;\u0131n daha sa\u011flam ve \u00f6ng\u00f6r\u00fclebilir olmas\u0131n\u0131 sa\u011flayarak, \u00f6zellikle geni\u015f Unicode karakter setleriyle \u00e7al\u0131\u015fan uygulamalarda veri bozulmas\u0131 ve g\u00fcvenlik sorunlar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilmesine yard\u0131mc\u0131 olur.<\/p>\n<h3>Array.prototype.sort() Kararl\u0131l\u0131\u011f\u0131<\/h3>\n<p>ES2019&#8217;dan \u00f6nce, <code>Array.prototype.sort()<\/code> metodunun kararl\u0131l\u0131\u011f\u0131 (stability) ECMAScript standard\u0131nda belirtilmemi\u015fti. Kararl\u0131 bir s\u0131ralama algoritmas\u0131, s\u0131ralama anahtarlar\u0131 e\u015fit olan elemanlar\u0131n orijinal dizideki g\u00f6receli s\u0131ras\u0131n\u0131 korur. Yani, e\u011fer iki eleman s\u0131ralama kriterine g\u00f6re e\u015fitse, s\u0131ralanm\u0131\u015f dizideki konumlar\u0131 orijinal dizideki konumlar\u0131yla ayn\u0131 olmal\u0131d\u0131r.<\/p>\n<p>Bu durum, farkl\u0131 JavaScript motorlar\u0131n\u0131n (\u00f6rne\u011fin V8, SpiderMonkey, JavaScriptCore) <code>sort()<\/code> metodunu farkl\u0131 \u015fekillerde uygulamas\u0131na neden oluyordu. Baz\u0131 motorlar kararl\u0131 bir s\u0131ralama algoritmas\u0131 kullan\u0131rken, di\u011ferleri kullanm\u0131yordu. Bu tutars\u0131zl\u0131k, \u00f6zellikle birden fazla kritere g\u00f6re s\u0131ralama yap\u0131ld\u0131\u011f\u0131nda veya karma\u015f\u0131k nesne dizileri \u00fczerinde \u00e7al\u0131\u015f\u0131rken \u00f6ng\u00f6r\u00fclemeyen davran\u0131\u015flara yol a\u00e7abiliyordu.<\/p>\n<p>ES2019 ile birlikte, <code>Array.prototype.sort()<\/code> metodunun <strong>kararl\u0131<\/strong> olmas\u0131 standartla\u015ft\u0131r\u0131lm\u0131\u015ft\u0131r. Bu, art\u0131k t\u00fcm uyumlu JavaScript motorlar\u0131n\u0131n, e\u015fit elemanlar\u0131n g\u00f6receli s\u0131ras\u0131n\u0131 koruyaca\u011f\u0131n\u0131 garanti eder. Bu de\u011fi\u015fiklik, \u00f6zellikle karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 s\u0131ralarken daha g\u00fcvenilir ve \u00f6ng\u00f6r\u00fclebilir sonu\u00e7lar elde edilmesini sa\u011flar.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Birden fazla kritere g\u00f6re s\u0131ralama yaparken (\u00f6rne\u011fin, \u00f6nce ya\u015fa g\u00f6re, sonra isme g\u00f6re s\u0131ralama).<br \/>\n*   Verilerin orijinal giri\u015f s\u0131ras\u0131n\u0131n belirli bir \u00f6neme sahip oldu\u011fu durumlarda.<br \/>\n*   UI&#8217;da listeleri s\u0131ralarken, ayn\u0131 de\u011fere sahip elemanlar\u0131n konumlar\u0131n\u0131n de\u011fi\u015fmemesini sa\u011flamak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Nesnelerden olu\u015fan bir dizi\nconst users = [\n  { name: 'Alice', age: 30 },\n  { name: 'Bob', age: 25 },\n  { name: 'Charlie', age: 30 },\n  { name: 'David', age: 25 }\n];\n\n\/\/ Ya\u015fa g\u00f6re s\u0131ralama (ES2019 sonras\u0131 kararl\u0131 davran\u0131\u015f)\n\/\/ Ayn\u0131 ya\u015fa sahip olan 'Alice' ve 'Charlie' ile 'Bob' ve 'David'in orijinal s\u0131ralar\u0131 korunmal\u0131d\u0131r.\nusers.sort((a, b) => a.age - b.age);\n\nconsole.log(users);\n\/*\n\u00c7\u0131kt\u0131 (kararl\u0131 s\u0131ralama ile):\n[\n  { name: 'Bob', age: 25 },    \/\/ Orijinalde 2. s\u0131rada\n  { name: 'David', age: 25 },  \/\/ Orijinalde 4. s\u0131rada\n  { name: 'Alice', age: 30 },  \/\/ Orijinalde 1. s\u0131rada\n  { name: 'Charlie', age: 30 } \/\/ Orijinalde 3. s\u0131rada\n]\n*\/\n\n\/\/ E\u011fer s\u0131ralama kararl\u0131 olmasayd\u0131, 'Bob' ve 'David'in veya 'Alice' ve 'Charlie'nin yerleri de\u011fi\u015febilirdi.\n\/\/ \u00d6rne\u011fin, 'David' 'Bob'dan \u00f6nce gelebilirdi veya 'Charlie' 'Alice'den \u00f6nce gelebilirdi.\n\n\/\/ Kararl\u0131l\u0131\u011f\u0131n \u00f6nemi:\n\/\/ Diyelim ki \u00f6nce isme g\u00f6re, sonra ya\u015fa g\u00f6re s\u0131ralamak istiyoruz.\n\/\/ 1. \u00d6nce isme g\u00f6re s\u0131rala (bu s\u0131ralama kararl\u0131 olmal\u0131 ki, ayn\u0131 isimler i\u00e7in orijinal s\u0131ra bozulmas\u0131n)\n\/\/ 2. Ard\u0131ndan ya\u015fa g\u00f6re s\u0131rala (bu da kararl\u0131 olmal\u0131 ki, ayn\u0131 ya\u015flar i\u00e7in isim s\u0131ralamas\u0131 bozulmas\u0131n)\n\n\/\/ Ger\u00e7ek hayatta genellikle tek bir sort \u00e7a\u011fr\u0131s\u0131 ile yap\u0131l\u0131r:\nconst people = [\n  { name: 'John', age: 30 },\n  { name: 'Jane', age: 25 },\n  { name: 'John', age: 20 }\n];\n\n\/\/ \u00d6nce isme g\u00f6re (artan), sonra ya\u015fa g\u00f6re (artan) s\u0131ralama\npeople.sort((a, b) => {\n  if (a.name < b.name) return -1;\n  if (a.name > b.name) return 1;\n  return a.age - b.age; \/\/ \u0130simler e\u015fitse ya\u015fa g\u00f6re s\u0131rala\n});\n\nconsole.log(people);\n\/*\n\u00c7\u0131kt\u0131:\n[\n  { name: 'Jane', age: 25 },\n  { name: 'John', age: 20 }, \/\/ 'John', age 20, 'John', age 30'dan \u00f6nce gelir\n  { name: 'John', age: 30 }\n]\n*\/<\/code><\/pre>\n<p><code>Array.prototype.sort()<\/code>&#8216;un kararl\u0131 hale gelmesi, JavaScript geli\u015ftiricileri i\u00e7in \u00f6nemli bir kolayl\u0131k ve g\u00fcvenilirlik art\u0131\u015f\u0131 sa\u011flam\u0131\u015ft\u0131r. Bu, \u00f6zellikle karma\u015f\u0131k s\u0131ralama gereksinimleri olan uygulamalar i\u00e7in daha \u00f6ng\u00f6r\u00fclebilir ve hatas\u0131z kod yaz\u0131lmas\u0131na olanak tan\u0131r.<\/p>\n<h3>G\u00f6zden Ge\u00e7irilmi\u015f Function.prototype.toString()<\/h3>\n<p>ES2019&#8217;dan \u00f6nce, <code>Function.prototype.toString()<\/code> metodunun davran\u0131\u015f\u0131, fonksiyonlar\u0131n kaynak kodunu temsil etme konusunda baz\u0131 tutars\u0131zl\u0131klara sahipti. \u00d6zellikle, fonksiyon tan\u0131mlar\u0131n\u0131n i\u00e7indeki yorumlar, bo\u015fluklar veya parantezler gibi bi\u00e7imlendirme detaylar\u0131n\u0131n <code>toString()<\/code> \u00e7\u0131kt\u0131s\u0131nda korunup korunmayaca\u011f\u0131 standartla\u015ft\u0131r\u0131lmam\u0131\u015ft\u0131. Bu durum, farkl\u0131 JavaScript motorlar\u0131n\u0131n ayn\u0131 fonksiyon i\u00e7in farkl\u0131 <code>toString()<\/code> \u00e7\u0131kt\u0131lar\u0131 \u00fcretmesine neden olabiliyordu. Geli\u015ftirici ara\u00e7lar\u0131, hata ay\u0131klay\u0131c\u0131lar veya kod analiz ara\u00e7lar\u0131 i\u00e7in bu tutars\u0131zl\u0131klar sorun yaratabiliyordu.<\/p>\n<p>ES2019 ile birlikte, <code>Function.prototype.toString()<\/code> metodu g\u00f6zden ge\u00e7irilerek daha kat\u0131 bir \u015fekilde standartla\u015ft\u0131r\u0131lm\u0131\u015ft\u0131r. Art\u0131k bu metot, fonksiyonun orijinal kaynak kodunun m\u00fcmk\u00fcn oldu\u011funca do\u011fru ve asl\u0131na sad\u0131k bir temsilini d\u00f6nd\u00fcrmeyi garanti eder. Bu, fonksiyonun tan\u0131m\u0131ndaki yorumlar\u0131, bo\u015fluklar\u0131 ve parantezleri korumay\u0131 i\u00e7erir.<\/p>\n<p><strong>Kullan\u0131m Senaryolar\u0131:<\/strong><br \/>\n*   Geli\u015ftirici ara\u00e7lar\u0131n\u0131n (\u00f6rne\u011fin, hata ay\u0131klay\u0131c\u0131lar, kod edit\u00f6rleri) fonksiyon tan\u0131mlar\u0131n\u0131 daha do\u011fru bir \u015fekilde g\u00f6stermesi.<br \/>\n*   Kod analizi ve statik analiz ara\u00e7lar\u0131n\u0131n daha g\u00fcvenilir sonu\u00e7lar \u00fcretmesi.<br \/>\n*   Meta programlama veya kod enjeksiyonu gibi ileri seviye senaryolarda fonksiyon kaynak koduna ihtiya\u00e7 duyuldu\u011funda tutarl\u0131l\u0131k sa\u011flamak.<br \/>\n*   Test ortamlar\u0131nda fonksiyonlar\u0131n beklenen \u015fekilde tan\u0131mland\u0131\u011f\u0131n\u0131 do\u011frulamak.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ Fonksiyon tan\u0131m\u0131 i\u00e7inde yorumlar ve bo\u015fluklar bulunan bir \u00f6rnek\nfunction \/<em> bu bir yorum <\/em>\/   myFunction  ( \/<em> arg\u00fcman <\/em>\/ a, b )   {\n  \/\/ Fonksiyon g\u00f6vdesi\n  const sum = a + b;\n  return sum;\n}\n\n\/\/ ES2019 \u00f6ncesi, bu \u00e7\u0131kt\u0131n\u0131n tam olarak ne olaca\u011f\u0131 belirsizdi.\n\/\/ Baz\u0131 motorlar yorumlar\u0131 ve fazladan bo\u015fluklar\u0131 atabilirdi.\nconsole.log(myFunction.toString());\n\/*\nES2019 sonras\u0131 \u00e7\u0131kt\u0131 (standartla\u015ft\u0131r\u0131lm\u0131\u015f):\n\"function \/<em> bu bir yorum <\/em>\/   myFunction  ( \/<em> arg\u00fcman <\/em>\/ a, b )   {\n  \/\/ Fonksiyon g\u00f6vdesi\n  const sum = a + b;\n  return sum;\n}\"\n*\/\n\n\/\/ Ok fonksiyonlar\u0131 i\u00e7in de benzer \u015fekilde \u00e7al\u0131\u015f\u0131r\nconst arrowFunc = (x) => \/<em> yorum <\/em>\/ x * 2;\nconsole.log(arrowFunc.toString());\n\/*\nES2019 sonras\u0131 \u00e7\u0131kt\u0131:\n\"(x) => \/<em> yorum <\/em>\/ x * 2\"\n*\/\n\n\/\/ Yerel fonksiyonlar\nfunction outer() {\n  function inner(param) { return param * 10; }\n  return inner;\n}\nconst innerFunc = outer();\nconsole.log(innerFunc.toString());\n\/*\nES2019 sonras\u0131 \u00e7\u0131kt\u0131:\n\"function inner(param) { return param * 10; }\"\n*\/<\/code><\/pre>\n<p>Bu standartla\u015ft\u0131rma, JavaScript&#8217;in meta programlama yeteneklerini g\u00fc\u00e7lendirirken, geli\u015ftiricilerin kod \u00fczerinde daha fazla g\u00fcven ve tutarl\u0131l\u0131kla \u00e7al\u0131\u015fmas\u0131na olanak tan\u0131r. \u00d6zellikle karma\u015f\u0131k geli\u015ftirme ortamlar\u0131nda ve ara\u00e7lar\u0131nda bu \u00f6zellik b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>ECMAScript 2019 (ES2019 \/ ES10), JavaScript diline b\u00fcy\u00fck ve \u00e7\u0131\u011f\u0131r a\u00e7an de\u011fi\u015fiklikler getirmese de, geli\u015ftiricilerin g\u00fcnl\u00fck i\u015f ak\u0131\u015flar\u0131n\u0131 kolayla\u015ft\u0131ran, kodun okunabilirli\u011fini ve g\u00fcvenilirli\u011fini art\u0131ran bir dizi de\u011ferli \u00f6zellik sunmu\u015ftur. Bu s\u00fcr\u00fcm, dilin olgunla\u015fma s\u00fcrecinde \u00f6nemli bir ad\u0131m olarak g\u00f6r\u00fclebilir; mevcut davran\u0131\u015flar\u0131 standartla\u015ft\u0131rarak ve k\u00fc\u00e7\u00fck ama etkili eklemelerle geli\u015ftirici deneyimini iyile\u015ftirerek JavaScript&#8217;i daha sa\u011flam ve tutarl\u0131 hale getirmi\u015ftir.<\/p>\n<p><code>Array.prototype.flat()<\/code> ve <code>Array.prototype.flatMap()<\/code>, dizilerle \u00e7al\u0131\u015fmay\u0131 basitle\u015ftirerek karma\u015f\u0131k veri manip\u00fclasyonlar\u0131n\u0131 daha k\u0131sa ve anla\u015f\u0131l\u0131r bir \u015fekilde ifade etme imkan\u0131 sunar. <code>Object.fromEntries()<\/code>, nesneler ve diziler aras\u0131ndaki d\u00f6n\u00fc\u015f\u00fcmleri kolayla\u015ft\u0131rarak veri ak\u0131\u015f\u0131n\u0131 optimize eder. <code>String.prototype.trimStart()<\/code> ve <code>trimEnd()<\/code>, dize temizleme i\u015flemlerinde daha fazla kontrol ve esneklik sa\u011flar. <code>Symbol.prototype.description<\/code>, sembollerin hata ay\u0131klama s\u00fcre\u00e7lerinde daha anlaml\u0131 olmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. Opsiyonel <code>catch<\/code> ba\u011flam\u0131, hata y\u00f6netimini basitle\u015ftirerek kodun daha temiz kalmas\u0131na yard\u0131mc\u0131 olurken, <code>JSON.stringify<\/code> i\u00e7in iyi bi\u00e7imlendirilmi\u015f Unicode deste\u011fi uluslararas\u0131la\u015fma ve veri g\u00fcvenli\u011fi a\u00e7\u0131s\u0131ndan kritik bir iyile\u015ftirme sunar. Son olarak, <code>Array.prototype.sort()<\/code>&#8216;un kararl\u0131l\u0131\u011f\u0131n\u0131n standartla\u015ft\u0131r\u0131lmas\u0131 ve <code>Function.prototype.toString()<\/code>&#8216;un g\u00f6zden ge\u00e7irilmesi, dilin tutarl\u0131l\u0131\u011f\u0131n\u0131 ve \u00f6ng\u00f6r\u00fclebilirli\u011fini art\u0131rarak farkl\u0131 JavaScript motorlar\u0131 aras\u0131ndaki davran\u0131\u015f farkl\u0131l\u0131klar\u0131n\u0131 azaltm\u0131\u015ft\u0131r.<\/p>\n<p>Bu \u00f6zelliklerin t\u00fcm\u00fc, JavaScript&#8217;i daha g\u00fc\u00e7l\u00fc, daha esnek ve geli\u015ftiriciler i\u00e7in daha keyifli bir dil haline getirme yolunda at\u0131lm\u0131\u015f \u00f6nemli ad\u0131mlard\u0131r. ES2019, dilin s\u00fcrekli geli\u015fiminin bir kan\u0131t\u0131 olup, gelecekteki ECMAScript s\u00fcr\u00fcmleri i\u00e7in de temel olu\u015fturmaktad\u0131r. Geli\u015ftiricilerin bu yeni ara\u00e7lar\u0131 benimsemesi, daha modern, verimli ve hatas\u0131z JavaScript uygulamalar\u0131 olu\u015fturmalar\u0131na olanak tan\u0131yacakt\u0131r. JavaScript ekosistemi her y\u0131l yeni \u00f6zelliklerle zenginle\u015fmeye devam ederken, bu t\u00fcr k\u00fc\u00e7\u00fck ama etkili g\u00fcncellemeler dilin geni\u015f kitleler taraf\u0131ndan benimsenmesinde ve web&#8217;in geli\u015fiminde kilit rol oynamaktad\u0131r.<br \/>\n<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi\nGiri\u015f\nJavaScript, web geli\u015ftirmenin temel ta\u015f\u0131 olmaya devam ederken, ECMAS","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-31731","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>ECMAScript 2019 (ES2019) \/ ES10&#039;daki Yenilikler: JavaScript&#039;in Evrimi - 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\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ECMAScript 2019 (ES2019) \/ ES10&#039;daki Yenilikler: JavaScript&#039;in Evrimi\" \/>\n<meta property=\"og:description\" content=\"ECMAScript 2019 (ES2019) \/ ES10&#039;daki Yenilikler: JavaScript&#039;in Evrimi Giri\u015f JavaScript, web geli\u015ftirmenin temel ta\u015f\u0131 olmaya devam ederken, ECMAS\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-13T06:41:04+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi\",\"datePublished\":\"2025-10-13T06:41:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\"},\"wordCount\":2821,\"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\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\",\"name\":\"ECMAScript 2019 (ES2019) \/ ES10'daki Yenilikler: JavaScript'in Evrimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-13T06:41:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi\"}]},{\"@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":"ECMAScript 2019 (ES2019) \/ ES10'daki Yenilikler: JavaScript'in Evrimi - 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\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/","og_locale":"tr_TR","og_type":"article","og_title":"ECMAScript 2019 (ES2019) \/ ES10'daki Yenilikler: JavaScript'in Evrimi","og_description":"ECMAScript 2019 (ES2019) \/ ES10'daki Yenilikler: JavaScript'in Evrimi Giri\u015f JavaScript, web geli\u015ftirmenin temel ta\u015f\u0131 olmaya devam ederken, ECMAS","og_url":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-13T06:41:04+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi","datePublished":"2025-10-13T06:41:04+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/"},"wordCount":2821,"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\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/","url":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/","name":"ECMAScript 2019 (ES2019) \/ ES10'daki Yenilikler: JavaScript'in Evrimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-13T06:41:04+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ecmascript-2019-es2019-es10daki-yenilikler-javascriptin-evrimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"ECMAScript 2019 (ES2019) \/ ES10&#8217;daki Yenilikler: JavaScript&#8217;in Evrimi"}]},{"@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\/31731","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=31731"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31731\/revisions"}],"predecessor-version":[{"id":31732,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31731\/revisions\/31732"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}