Bu yazımızda JavaScript bilginizi test edip bu bilgileriniz pekiştirebileceğiniz faydalı örnekleri derledik. Q-1) tripleAdd(30)(40)(50) örneğini kodlayın [crayon-6649d8dcc9653777714329/] Q-2) javaScrip'te IIFE nedir ve ne işe yarar? javaScrip’te IIFE; Immediately Invoked Function Expressions kelimelerinin kısaltmasını temsil etmektedir. Bu yapı Türkçeye Anında Çağrılan Fonksiyonlar anlamına gelmektedir. Bu fonksiyonlar oluşturulduğu anda çalıştıkları için birtakım avantajlara sahiptir: IIFE ile oluşturulan değişkenler dış dünya tarafından görülmez. Yani bu demektir ki bir kod bloğunu fonksiyonun kapsamına sokarak değişkenlerin ve fonksiyonların global kapsama (global scope) sızmasını önler. Modüler bir kullanımı sağladığı için kodun daha temiz, daha düzenli ve daha güvenli olmasını sağlar. Q-3) JavaScript'te "closure" kavramı ne işe yarar? JavaScript’te closure (kapama), bir iç fonksiyonun, dış fonksiyonun değişkenlerine ve kapsamına erişebilmesi olarak tanımlanan bir programlama kavramıdır. [crayon-6649d8dcc965c601375833/] Yukarıdaki kodda counter() fonksiyonu, count değişkenini kapsayan bir closure olarak kodlanmıştır. Böylececounter() fonksiyonu her çağrıldığında, count değişkeninin değerini artırır ve artırılmış değeri döndürür. Closure sayesinde, counter() fonksiyonu, count değişkenine erişebilir ve her çağrıldığında count değişkeninin değerini güncelleyebilir. Q-4) JavaScript'te "this" kavramı ne işe yarar? JavaScript’te this kelimesi, çalıştırılan bir fonksiyonun içinde bulunduğu nesneyi temsil eden bir özelliktir. [crayon-6649d8dcc9660438777114/] Yukarıdaki örnekte, fullName() fonksiyonunun içindeki this kelimesi, person nesnesini temsil etmektedir. Yani person.fullName() çağrısı yapıldığında, this.firstName ve this.lastName özellikleri, person nesnesinin özelliklerine erişir ve John Doe stringini döndürür. Bu sayede, person nesnesi içindeki özellikler, this kelimesi kullanılarak kullanılabilir hale gelir. Q-5) JavaScript'te "hoisting" kavramı ne işe yarar? Ayrıca "variable hoisting" ile "function hoisting" kavramlarını açıklayınız. JavaScript’te hoisting kavramı kısaca “kodun çalışması öncesinde değişken ve fonksiyon tanımlarının belleğe yüklenmesi (hoisted)” anlamına gelir. Böylece ilgili değişken veya fonksiyon, kodun herhangi bir yerinde kullanılabilir hale gelir. Variable hoisting, değişken tanımlarının, tanımlandıkları blok veya fonksiyonun en üstüne taşınması anlamına gelir. Ancak belirtmek gerekir ki bu özellik yalnızca var ile tanımlanan değişkenler için geçerli olmaktadır. Ayrıca sadece değişkenin adı taşınır, değişkenin değeri taşınmaz. Değişkenin değeri, tanımlandığı yere kadar undefined olarak tutulur. Function hoisting de benzer şekilde fonksiyon tanımlarının, aynı şekilde, tanımlandıkları blok veya fonksiyonun en üstüne taşınması anlamına gelir. Ancak fonksiyon tanımlarının değişken tanımlarından farklı olarak, hem fonksiyonun adı hem de fonksiyonun içeriği taşınır. [crayon-6649d8dcc9663995450312/] Yukarıdaki örnekte a değişkeni ve foo() fonksiyonu, tanımlandıkları yerden önce kullanılmalarına rağmen, her ikisi de kodun en üstüne hoisted edilirler. Bu nedenle, console.log(a) ifadesi, undefined değerini döndürürken foo() fonksiyonu ise "hello" stringini döndürür. Q-6) JavaScript'teki "abstract equality (==)" ile "strict equality (===)" arasındaki farklar nelerdir? soyut eşitlik (==) ile katı eşitlik (===) arasındaki en temel fark “tip” ve “değer” karşılaştırmasıdır. === ile iki değerin hem tipini hem de değeri karşılaştırılırken == ile değerlerin tipleri eşitlenerek sadece değer karşılaştırması yapılır. [crayon-6649d8dcc9666052307689/] Credit: MDN Genel olarak, JavaScript’te veri tipleri arasında yapılan karşılaştırmalarda === operatörü tercih edilmelidir. Zira == operatörü ile kod tahmin edilebilirliği zorlaştığı için tavsiye edilmez. Q-7) Aşağıdaki program çıktı olarak ne verir? [crayon-6649d8dcc966a163945448/] Q-8) Aşağıdaki program çıktı olarak ne verir? [crayon-6649d8dcc966d615258422/] Q-9) Aşağıdaki program çıktı olarak ne verir? [crayon-6649d8dcc9670647061862/] Q-10) JavaScript'te "use strict" ifadesi nedir, ne işe yarar? JavaScript’te "use strict" (katı mod) ifadesi, yazılan kodun daha güvenli, tutarlı ve hata ayıklamasının daha kolay olmasını sağlamak için kullanılan bir yöntemdir. "use strict" ifadesi, aşağıdaki gibi bazı davranışları değiştirir: İşlev ve değişken tanımlamalarında var kullanılmazsa, hata verir. Değiştirilemez nesne olan arguments, değiştirilemez olmaktan çıkar. Silinebilir özellikler üzerinde delete operatörü kullanılırsa, hata verir. Global nesnedeki özelliklerin değiştirilmesi veya silinmesi durumunda hata verir. Tanımsız değişkenler kullanılırsa, hata verir. [crayon-6649d8dcc9673365284334/] Yukarıdaki örnekte normal şartlarda London çıktısı verecekken "use strict" ifadesinin eklenmesiyle hata aldık. Bu hata istenilen bir şeydir. Zira "use strict" ifadesinin eklenmesi, kodun daha güvenli ve tutarlı hale getirilmesine yardımcı olur. Ayrıca, kodun daha hızlı ve hatasız bir şekilde yazılmasını ve hata ayıklanmasını da kolaylaştırır. Bu nedenle, modern JavaScript uygulamalarında "use strict" ifadesi sıklıkla kullanılmaktadır. Q-11) Aşağıdaki fonksiyonu "curry function" şeklinde yazınız. [crayon-6649d8dcc9676282425983/] Yukarıdaki fonksiyonu curry şeklinde aşağıdaki gibi yazabiliriz: [crayon-6649d8dcc9679282572470/] Q-12) Bir fonksiyonun kaç kere çağrıldığını sayan örnek bir "counter fonksiyonu" yazın. [crayon-6649d8dcc967c061705706/] Q-12) Aşağıdaki program çıktı olarak ne verir? [crayon-6649d8dcc967f322906431/] Çıktı: [crayon-6649d8dcc9688613927001/] Q-13) Aşağıdaki program çıktı olarak ne verir? [crayon-6649d8dcc968b068155217/] Bu program, [1, 2, 3, 4, 5, 6, 7, 8] çıktısını verecektir. Bu sonuç, list1 ve list2 değişkenlerinin aynı referansı paylaşması nedeniyle oluşur. Yani, list2, list1 değişkeninin bir referansıdır ve list1 üzerinde yapılan değişiklikler list2 de yansıtılır. Q-14) Yukarıdaki problemde list2'yi list1'e değerleri değişmeyecek şekilde nasıl kopyalarız? slice() veya concat([ ]) metotlarını kullanabiliriz. [crayon-6649d8dcc968f683311416/] Çıktı: [crayon-6649d8dcc9692242670889/] Q-15) "passing data by value" ve "passing data by reference" kavramlarını açıklayınız. passing data by value (değer ile veri aktarma), bir değişkenin değerinin başka bir değişkene kopyalanmasıdır. Bu durumda, ilk değişkende yapılan değişiklikler, ikinci değişkene yansıtılmaz. passing data by reference (referans ile veri aktarma), bir değişkenin referansının başka bir değişkene atanmasıdır. Bu durumda, ilk değişkende yapılan değişiklikler, ikinci değişkene de yansıtılır. Q-16) JSON nedir, ne işe yarar ve hangi veri tipleri ile kullanılır açıklayınız. Açılımı JavaScript Object Notation şeklinde olan JSON bir veri değişim formatıdır ve verileri metin biçiminde temsil etmeye yarar. Genel olarak verileri depolamak, değiş tokuş etmek veya web uygulamalarında kullanılır. JSON şu veri tiplerini içerir: string: Çift tırnak içindeki metinler. (❗ Tek tırnak şeklinde kullanılamaz.)number: Tam sayılar, ondalık sayılar veya bilimsel gösterimli sayılar.boolean: true veya false değerlerini ifade eder.null: Bir değerin eksik olduğunu belirtmek için kullanılır.object: Çift süslü parantez {} arasında tanımlanan bir veri koleksiyonu. Bu nesneler, anahtar-değer çiftleri şeklinde tanımlanır. Bu değer çiftleri de çift tırnak içinde yazılır.array: Köşeli parantez [] içinde tanımlanan bir veri koleksiyonudur. Bu nesneler, sıralı elemanlar listesi şeklinde tanımlanır. Örneğin: [crayon-6649d8dcc9696680664640/] Q-17) Aşağıdaki programın çıktısı hangi sıralamada olur? [crayon-6649d8dcc969c663659551/] Çıktı: 1432 Q-18) JavaScript ile object oluşturabilmek için hangi yöntemler kullanılır? JavaScript’te, nesne oluşturmanın birkaç yolu vardır: Object Literal: Bu yöntem, bir nesne tanımlama sözdizimi kullanarak bir nesne oluşturur. Nesnenin özellikleri ve değerleri süslü parantez {} içinde belirtilir. Örneğin: [crayon-6649d8dcc969f600119193/] Constructor Function (Yapıcı fonksiyon): Bu yöntem, bir yapıcı fonksiyon kullanarak bir nesne oluşturur. Yapıcı fonksiyon, nesnenin özelliklerini ve değerlerini belirler. [crayon-6649d8dcc96a2887538449/] Object.create() methodu: Bu yöntem, önceden var olan nesneyi bir prototip olarak kullanarak yeni bir nesne oluşturur. [crayon-6649d8dcc96a5219232522/] Q-19) Aşağıdaki kod yapısı çıktı olarak hangi data tiplerini verir? [crayon-6649d8dcc96a8286958546/] Q-20) JavaScript'te "bind()" yöntemi ne işe yarar? JavaScript’te bind() metodu, bir fonksiyonun bağlamını (context) belirlemeye ve yeni bir fonksiyon oluşturmaya yarayan bir metottur. Bağlama işlemi, bir fonksiyonun this değerini belirler. bind() metodu, özellikle bir fonksiyonu belirli bir bağlama (context) içinde çağırmak istediğinizde kullanışlıdır. Zira bind metodu yeni bir fonksiyon döndürdüğü gibi orijinal fonksiyonu da değiştirmez: [crayon-6649d8dcc96ac702273501/] Q-21) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96af354480437/] JavaScript’te object’ler her ne kadar aynı özelliklere sahip olsalar bile, farklı nesne referanslarına sahip oldukları için (pass by reference) eşit olamazlar. Q-23) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96b4898549475/] Çıktı: arr1: []arr2: [ <3 empty items> ] // 3 tane boş array oluşturur.arr3: [ ‘Hello’, ‘World’ ]arr4: [ 1, 2, ‘three’, 4, ‘five’ ]arr4: [ [ 1, 2, 3, 4, 5 ] ] Q-24) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96b7507233363/] Çıktı: 2-14-1 Q-25) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96bb075412015/] Bu beklenmedik sonucun nedeni, virgülden sonra belirli sayıda basamağa sahip kayan noktalı sayıların hesaplanmasındaki işlem kesinliği hatasıdır. Bu hatanın sonucu olarak, 300.3 * 3 ifadesi beklenenden biraz daha az olan 900.9000000000001 değerini döndürür. Bu nedenle, 900.9 === 900.9000000000001 ifadesi false sonucunu verir. Bu sorunu çözmek için aşağıdaki yöntemlerden biri denenebilir: [crayon-6649d8dcc96be114651213/] Q-26) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96c1371535619/] Q-27) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96c4958634199/] JavaScript’te objeler birer referans türüdür. Yani diyebiliriz ki objeler, bellekte bir yere işaret eden adreslerdir. Bu nedenle, bir objeyi bir değişkene atadığımızda, o değişken aslında o objenin bellekteki adresini tutar. Şimdi gelelim sorumuza. const b = { name: ‘b’ }; ifadesi çalıştığında, bellekte { name: ‘b’ } objesi oluşturulur ve bu objenin bellekteki adresi b değişkenine atanır. Benzer şekilde const c = { name: ‘c’ }; ifadesi çalıştığında, bellekte { name: ‘c’ } objesi oluşturulur ve bu objenin bellekteki adresi c değişkenine atanır. const a = {}; ifadesi çalıştığında, bellekte boş bir obje oluşturulur ve bu objenin bellekteki adresi a değişkenine atanır. Daha sonra, a[b] = 250 ifadesi çalıştığında, a nesnesine b değişkeninin işaret ettiği bellek adresindeki objenin property’si olarak 250 atanır. Ancak, b değişkeni bellekteki bir adrese işaret ettiği için, aslında a nesnesine bir property eklenmez. Ardından, a[c] = 500 ifadesi çalıştığında da benzer şekilde, c değişkeninin işaret ettiği bellek adresindeki objenin property’si olarak 500 atanır. Şimdi a nesnesinin içeriğine baktığımızda, { ‘[object Object]’: 200, ‘[object Object]’: 500 } şeklinde iki adet property olduğunu görürüz. Bunun nedeni ise JavaScript’teki nesne anahtarlarının sadece string türü olmasından dolayıdır. Bu örnekte, b ve c nesneleri boş nesneler olduğundan, her ikisi de [object Object] olarak dönüştürülür ve sonuçta a[‘[object Object]’] iki kez atanır. Bu nedenle, a[b] ifadesi a[‘[object Object]’] olarak değerlendirilir ve sonucu 500 döndürür. Yani özetle: [crayon-6649d8dcc96c9868355514/] Q-28) Aşağıdaki program hangi çıktıyı verir? [crayon-6649d8dcc96d0694109878/] Yukarıdaki örnek x değişkenine verilen değerin değiştirilmediği için 10 değerini verir. Bu nedenle, y()fonksiyonu içinde tanımlanan x fonksiyonu nedeniyle bir kaldırma hatası (hoisting error) alır. Q-29) JavaScript dinamik bir dil (dynamic language) midir? JavaScript dinamik bir dildir, yani bu demektir ki değişkenlerin veri tipleri runtime esnasında değişebilir. [crayon-6649d8dcc96d4199127332/] Yukarıdaki örnekte x sayısal bir veri tipi olarak tanımlanmış ama sonrasında string ve boolean veri tiplerine dönüştürülebilmiştir. Q-30) JavaScript veri tiplerini nasıl belirler? JavaScript, atanan (assign) değere bağlı olarak veri tipini belirler. Bu demektir ki eğer 10 değeri atarsanız ilgili değişken sayısal veri tipi olur. Eğer “Merhaba” gibi bir metinsel ifade atarsanız string veri tipi olur. Q-31) JavaScript'te veri tipi nasıl kontrol edilir? JavaScript’te veri tipini kontrol etmek için “typeof” metodu kullanılır. [crayon-6649d8dcc96d7267131616/] Q-32) JavaScript'te kaç farklı veri tipi bulunmaktadır? JavaScript’te toplam sekiz farklı veri tipi bulunmaktadır ve bu sekiz veri tipi İlkel (Primitive) ve Nesneler / İlkel olmayan (Non Primitive) olmak üzere 2 kategoriye ayrılır Q-33) JavaScript'te kaç farklı veri tipi bulunmaktadır? JavaScript’te toplam sekiz farklı veri tipi bulunmaktadır ve bu sekiz veri tipi İlkel (Primitive) ve Nesneler / İlkel olmayan (Non Primitive) olmak üzere 2 kategoriye ayrılır Q-33) JavaScript'te ilkel veri tipleri (primitive) nelerdir? string number bigint boolean null undefined symbol Q-34) JavaScript'te ilkel olmayan veri tipleri (non primitive) nelerdir? object (array, function haliyle bu veri tipine girer) Q-35) Null ve Undefined arasındaki farklar nelerdir? Undefined: Bir değişkenin oluşturulduğunu ancak o değişkene herhangi bir değerin atanmadığını (assign) ifade eder. [crayon-6649d8dcc96da943408912/] Null: bir değişkenin atanmış (assign) ancak içeriği boş olarak ayarlandığı anlamına gelir. Yani bir değişkenin değerinin null olması, bu değişkenin bir değeri olduğu ancak bu değerin hiçbir şey ifade etmediği, verinin yokluğu anlamına gelir. [crayon-6649d8dcc96dd058048639/] Q-36) Hoisting nedir? Değişkenlerin ve fonksiyon bildirimlerinin kapsamın en üstünde yer aldığı bir mekanizmadır. Q-37) Global değişkenler (global variables) ne demektir? Global değişkenler, web sayfası veya belge boyunca erişilebilen değişkenlerdir. Q-38) Global değişkenlerle ilgili sorunlar nelerdir? Global değişkenler her yerden erişilebilir olduğu için hata ayıklamayı (debugging) zorlaştırır. Q-39) Var, let veya const anahtar kelimeleri olmadan değişken bildirimi yapılabilir mi? Evet yapılabilir. [crayon-6649d8dcc96e2507239550/] Yukarıdaki gibi bir değişken ataması yapıldığında sanki var x = 10; şeklinde tanımlanmış gibi algılanır. Q-40) Global değişkenlerden nasıl kaçınabiliriz? Şu üç metod ile aşılabilir: Namespace Closures IIFE Q-41) Closure (Kapama) nedir? Closure’lar fonksiyonun içindeki fonksiyonlara denir ve normal bir fonksiyonu stateful hale getirir. Yani diyebiliriz ki bir fonksiyon içinde başka bir fonksiyon tanımlandığında, iç fonksiyon dış fonksiyonun değişkenlerine erişebilir ve bu değişkenlerin değerlerini kullanabilir. [crayon-6649d8dcc96e5814922793/] Q-42) JavaScript'te call stack nedir? Çağrı yığını (call stack), yürütülecek fonksiyonların kaydını tutar. LIFO yürütme yöntemini izler. Q-43) JavaScript'te blocking call nedir? Engelleyici çağrı (blocking call), bir işlem tamamlanana kadar diğer işlemlerin beklemek zorunda olduğu bir çağrıdır. Bu tür bir çağrı, kodun akışını engeller ve ilgili işlem tamamlanmadan devam etmez. Bu nedenle, engelleyici çağrılar, uygulamaların tepkisiz veya yavaş çalışmasına neden olabilir. Modern JavaScript uygulamaları, engelleyici çağrıların kullanımını azaltmak için genellikle asenkron işlem modeli kullanır. Bu modelde, uzun süreli işlemler asenkron fonksiyonlar veya promise’ler kullanarak gerçekleştirilir ve diğer işlemleri bekletilmez. Bu sayede uygulamalar daha hızlı ve daha verimli hale gelir. Q-44) JavaScript'te Asynch çağrılarını nasıl yapabiliriz? Async çağrıları yapmanın üç yolu vardır: • WebAPI Browser calls.• Promises• Worker threads. Q-45) JavaScript multi-threaded bir dil midir? Hayır. JavaScript single-threaded bir dildir. Q-46) JavaScript'te arrow fonksiyonu var mıdır? JavaScript’te arrow fonksiyonları, ES6 (ECMAScript 2015) ile birlikte hayatımıza giren yeni bir fonksiyon tanımlama yöntemidir. “Fat arrow” olarak da adlandırılan arrow fonksiyonları, function anahtar kelimesi yerine => işaretini kullanır. [crayon-6649d8dcc96e8249404933/] Yukarıdaki fonksiyonu arrow fonksiyonu ile yazarsak aşağıdaki gibi olur: [crayon-6649d8dcc96eb271186604/] Q-47) JavaScript'te default parameter nedir? JavaScript’te varsayılan parametreler (default parameters), hiçbir değer aktarılmadığında veya tanımlanmadığında fonksiyon parametrelerinin varsayılan değerlerle başlatılmasını sağlar. Q-48) JavaScript'te default parameter nedir? JavaScript’te varsayılan parametreler (default parameters), hiçbir değer aktarılmadığında veya tanımlanmadığında fonksiyon parametrelerinin varsayılan değerlerle başlatılmasını sağlar. Q-49) JavaScript'te destructing nedir? JavaScript’te destructuring, ES6 (ECMAScript 2015) ile tanıtılan bir özelliklerden biri olup dizi (array) veya nesne (object) verilerindeki öğelere daha kolay bir şekilde erişim sağlamak için kullanılır. Bu özellik, bir dizi veya nesne içindeki elemanları tek tek çıkararak veya özellikleri ayrı ayrı çıkararak değişkenlere atamamızı sağlar. Destructuring işlemi, atama operatörü (=) ile yapılır ve genellikle iki köşeli parantez ([[]]) veya iki süslü parantez ({{}}) arasında gösterilir. [crayon-6649d8dcc96ef837266373/] Q-50) JavaScript'te spread operatörü nedir? JavaScript’te spread operatörü, ES6 (ECMAScript 2015) ile tanıtılmış olup üç nokta (…) karakteri ile gösterilir. Özellikle dizi (array) veya nesne (object) verilerini kolayca kopyalamak, birleştirmek veya genişletmek için kullanılır. [crayon-6649d8dcc96f4567032965/] Q-51) JavaScript'teki rest parametresi nedir? JavaScript’te rest parameter, ES6 (ECMAScript 2015) ile tanıtılan özelliklerden biridir ve bir fonksiyona değişken sayıda argüman (argument) geçirmek için kullanılır. Bu özellik, fonksiyon tanımında üç nokta işareti (…) kullanarak belirtilir. Bu sayede bir fonksiyonun değişken sayıda argüman almasını sağlar ve bunları bir dizi (array) olarak toplar. [crayon-6649d8dcc96f7824771668/] Rest parametresi sayesinde tek tek bu argümanları girmek yerine bu işlem otomatik bir şekilde yapılmaktadır. Q-52) JavaScript'te var, let ve const arasındaki fark nedir? “var” function scope kuralına göre çalışan bir değişken tanımlama anahtar kelimesidir. Buna karşılık let ve const ise ES6 ile birlikte tanıtılmış olup block scope kuralına göre çalışan bir değişken tanımlama anahtar kelimesidir. Ancak const ile tanımlanan bir değişken, tanımlandıktan sonra bir daha değer ataması yapılamaz. Buna karşılık let ile tanımlanan bir değişken tekrar tekrar atanabilir. [crayon-6649d8dcc96fa739622976/] Q-52) JavaScript'te template literal ne işe yarar? Template literals, ES6 ile birlikte JavaScript diline eklenen özelliklerden biridir. String ifadelerinin oluşturulmasını daha kolay ve okunaklı hale getiren template literals, ters tırnak (backstick) işareti ile belirtilir ve içerisinde değişkenlerin veya ifadelerin yerleştirilmesine izin verir. Template literals kullanımı sayesinde, string ifadeleri içerisinde değişkenlerin veya ifadelerin yerleştirilmesi daha kolay hale gelir. Bunun için ${} işaretleri kullanılır ve içerisine değişkenler veya ifadeler yazılır. [crayon-6649d8dcc96fd336518468/] Ayrıca, template literals kullanarak çok satırlı string ifadeleri oluşturmak da mümkündür. Böylece, tek tırnak veya çift tırnak işaretleriyle uğraşmadan, çok satırlı string ifadeleri oluşturmak kolaylaşır. [crayon-6649d8dcc9702440913595/] Q-53) JavaScript'te higher-order function ne anlama gelir? JavaScript’te higher-order function (yüksek mertebeden fonksiyon), parametre olarak başka bir fonksiyonu alan veya fonksiyon döndüren fonksiyonlar olarak tanımlanabilir. [crayon-6649d8dcc9705337125228/] Q-54) JavaScript "forwards-compatible" bir dil midir? Birçok kişinin böyle olmasını dilemesine ve hatta yanlış bir şekilde böyle olduğu efsanesine inanmasına rağmen JavaScript forwards-compatible (ileriye dönük uyumlu) bir değildir. Buna karşın HTML ve CSS ileriye dönük uyumludur ancak geriye dönük uyumlu (backwards compatibility) değildir. Q-55) JavaScript interpreted bir dil mi yoksa compiled bir dil mi? Öncelikle, JavaScript yorumlanabilir bir dildir. Bu, JavaScript kodunun yorumlayıcı tarafından satır satır okunarak ve yorumlanarak çalıştırıldığı anlamına gelir. Yani, JavaScript kodu çalıştırıldığında, yorumlayıcı kodu okur ve ardından yorumlar, sonuçları hesaplar ve uygun şekilde davranış sergiler. Ancak, modern JavaScript motorları JIT derleme teknolojisi de kullanırlar. Bu, JavaScript kodunun yorumlanırken aynı zamanda JIT derleyicisi tarafından makine koduna derlenerek çalıştırıldığı anlamına gelir. JIT derleme, kodun bir kısmını veya tamamını makine diline çevirerek performansı arttırır ve yorumlama maliyetini azaltır. Bu demektir ki, JavaScript hem yorumlanabilir hem de JIT derlemesi yapılan bir dildir. Bu nedenle, uygulama kodu bir çeşit byte code’a dönüştürüldüğü için, bu cevaba göre JavaScript, compiled bir dillere benzer bir şekilde işlenir. Ancak, bu cevapta belirtilen süreçte de görüldüğü gibi, JavaScript bir interpreted dildir ve çoğu zaman kodlar satır satır yorumlanarak çalıştırılır. Yani, JavaScript hem interpreted hem de compiled özellikleri taşır. Bence JavaScript’in pratikte olmasa da ruhunda derlenmiş bir dil olduğu açıktır. JavaScript genel hatlarıyla derlenmiş bir dildir diyebiliriz, yani araçlar (JavaScript motoru dahil) bir programı çalıştırmadan önce işler ve doğrular (herhangi bir hatayı bildirir!).