JavaScript - e Kitap
JavaScript - e Kitap
JAVASCRIPT PROGRAMLAMA
Doç. Dr. ZEKİ ÖZEN,
3. Koşul Yapıları
4. Döngü Yapıları
5. Diziler
Özlü Söz
“Öğrenebileceğiniz en felaket şey ilk programlama dilinizdir.”
– Alan Kay
Kazanımlar
1. Web sayfasının bileşenlerini bilir.
Birlikte Düşünelim
1. Web sayfaları nasıl çalışır?
Başlamadan Önce
Bu kitabın başlangıç bölümü, Web teknolojisinin temel kavramlarına odaklanmıştır. İlk olarak internet ve Web teknolojileri hakkında bilgi verilmiştir.
Ardından bir Web sayfasının temel bileşenleri ve Web sayfalarının çalışma prensibi ele alınmıştır. Devamında JavaScript dilinin genel özellikleri ve
Web sayfalarında JavaScript kodunun yerleşimi ve JavaScript kodlarının çalıştırılması açıklanmıştır. Son olarak Visual Studio Code editörünün
kurulumu ve JavaScript kodlarken işe yarar uzantılar hakkında bilgi verilmektedir. Bu adımların tamamlanmasıyla okuyucular JavaScript diline giriş
yapmaya hazır olacaktır.
İnternet, Web teknolojisine (Hyper Text Transfer Protocol - HTTP) ilave olarak mail alma ve gönderme (Internet Message Access Protocol – IMAP,
Post Office Protocol – POP, Simple Mail Transfer Protocol - SMTP), dosya transferi (File Transfer Protocol - FTP), alan adı sistemi (Domain Name
System - DNS), güvenli giriş katmanı (Secure Sockets Layer – SSL) gibi çeşitli protokolleri barındırır (anon, 2024).
Web teknolojisinde sunucu (server) dediğimiz bilgisayarlarda önceden hazırlanmış statik HTML sayfaları istemci bilgisayarlara (client) HTTP
protokolü ile sunulmaktadır (MDN, 2024). Web sayfalarına erişmek için kullanılan özel programlara tarayıcı (browser) denmektedir. İstemci
bilgisayarlar tarayıcı aracılığıyla bir web sayfasına ziyaret isteği gönderirler. Web sunucusu bu isteğe cevap olarak istemciye istenilen sayfanın HTML
kodlarını veya istenilen kaynakları (her türlü formatta dosya) iletirler. İstemcideki tarayıcılar sunucunun gönderdiği HTML kodlarını alışık olduğumuz
web sayfası görünümüne dönüştürürler. Böylece istemci ve sunucu arasında bilgi alışverişi yapılmış olur (MDN, 2024) (Şekil 1).
HTML dosyaları statik (önceden hazırlanmış ve değişmeyen) yapıdadırlar. Bununla birlikte PHP, ASP, Python gibi diller ve veri tabanı bağlantılarıyla
dinamik Web sayfaları geliştirilmektedir. Bu kullanımda sunucu tarafında bu dillerin derleyici/yorumlayıcısı ve veri tabanı sunucusuyla üretilen
HTML kodu istemciye iletilmektedir.
HTML (Hyper Text Markup Language - Hiper Metin İşaretleme Dili), web sayfasının yapı ve içeriğinin oluşturulduğu etiket/işaret dilidir.
CSS (Cascading Style Sheets), web sayfasını oluşturan yapı ve içeriğin görünüş, biçim, renk, büyüklük, hizalama gibi görünümlerinin ayarlandığı
dildir.
JavaScript ile kullanıcının web sayfasındaki her türlü yapı ve içerikle neler yapacağı ve nasıl etkileşime gireceği tanımlanır.
Özetle HTML dili sayfanın yapı ve içeriği ile, CSS bunların nasıl görüneceği ile ilgilenir. JavaScript diliyle kullanıcı ve web sayfası arasındaki
etkileşim tanımlanır.
Derleme, kaynak kodların tek seferde ve bir bütün halinde bilgisayarın anlayacağı dile çevrilmesi işlemidir. Kaynak kodu makine diline çeviren ve bu
iş için özel olarak tasarlanmış programlara derleyici (compiler) denir. C, C++ gibi diller derlenen dilleridir. Kaynak kod derlendikten sonra
çalıştırılabilir bir dosya üretilir.
Yorumlama ise kaynak kodların çalışabilmesi için yorumlayıcı (interpreter) adı verilen özel bir program tarafından yorumlanması işlemidir.
JavaScript, R, Perl, Ruby gibi diller yorumlanan programlama dillerine örnek olarak verilebilir. Kaynak kod yorumlandığında çalıştırılabilir dosya
üretilmez, bunun yerine çıktı üretilir. Yorumlanan dillerin bir diğer özelliği de kaynak kodlar tek seferde değil satır satır veya bir satırın herhangi bir
kısmı tek başına yorumlanabilir ve çıktısı edinilebilir.
Kimi programlama dillerindeki kaynak kodun makine koduna dönüşümünde hem derleyici hem de yorumlayıcı kullanılır. Bunlara örnek olarak C#,
Java, Python, PHP dilleri verilebilir. Bu dillerin kodları önce kendi derleyicileri tarafından bir ara forma dönüştürülür, daha sonra yorumlayıcı ara
forma dönüştürülen program bileşenlerini yorumlar ve böylece kodun çalışması sağlanır.
Programlama dillerinin popülerliğini çeşitli parametrelere göre ayda bir yayınladıkları ölçümlerle listeleyen TIOBE indeksine göre JavaScript dünyada
en çok kullanılan 6. programlama dilidir (TIOBE, 2024). Listeye bakıldığında ilk sıralardaki diller farklı platform ve amaçlar için kullanılmaktadır.
Buradan hareketle JavaScript, çok sayıda programlama dillerinin kullanıldığı Web teknolojisinin en popüler dilidir denilebilir.
JavaScript dilinin Java diliyle bir ilgisi yoktur. Java dili, masaüstü ve kurumsal yazılımlar geliştirmek için tasarlanmıştır. Fakat her iki dil C ailesinden
gelmektedir. Bu sebeple Java ve JavaScript dillerinin grameri (sözdizimi) birbirine benzemektedir.
JavaScript dili yorumlanan bir dildir (Crockford, 2008). JavaScript kodlarının çalışması için herhangi bir tarayıcı yeterlidir. Bunun dışında bir derleyici
gerektirmez. Kimi tarayıcılar JavaScript kodlarını daha hızlı çalıştırmak için kendi geliştirdikleri motorları kullanırlar. Örneğin Firefox tarayıcısı
SpiderMonkey isimli motoru; Chrome, Opera ve Edge tarayıcıları V8 motorunu; Safari tarayıcısı JavaScriptCore motorunu kullanmaktadır.
Tarayıcıların kurulu olduğu her sistemde ve platformda (cross-platform) JavaScript kodları çalışabilir. Bu sebeple JavaScript dili platform bağımsızdır.
JavaScript dili, web sayfalarının görünen yüzündeki/ön yüzdeki/ön uçtaki (front-end) bileşenlerle kullanıcının etkileşmesi için tasarlanmıştır
(Ackermann, 2022). HTML, CSS ve JavaScript kodlarından oluşan Web sayfaları kullanıcının (istemcinin) tarayıcısında çalıştırılır ve yorumlanır. Bu
sebeple JavaScript daha önce açıklandığı üzere istemci taraflı (client-side) çalışan bir dildir (Ackermann, 2022). Fakat son yıllarda geliştirilen ve
kullanımı giderek yaygınlaşan [Link] ile JavaScript dili arka uç (back-end) ve sunucu taraflı (server-side) programlama amacıyla da kullanılmaktadır
([Link], 2024). JavaScript dili aynı zamanda mobil uygulama geliştirmek için de kullanılır. Mobil uygulamalar her platform için (Android, Apple,
Windows vb.) o platformun yerel (native) mimarisine/diline göre ayrı ayrı geliştirilmektedir. Bu ise bir uygulama için çok fazla dil bilmeyi, personel
çalıştırmayı gerektirmektedir. Bu durumu değiştirmek amacıyla uygulamanın bir kere yazılıp her platformda çalışması için çeşitli yöntemler, yazılım
çerçeveleri (framework) ve diller geliştirilmiştir. JavaScript tabanlı React Native, [Link], Vue Native gibi frameworkler ile bir kere yazılan ve her
platformda çalışabilen mobil uygulamalar geliştirilebilir (Şekil 3).
Web sayfasındaki elemanlara Doküman Nesne Modeli (Document Object Model – DOM) isimli arayüz ile erişim sağlanmakta ve içerik
manipülasyonu yapılmaktadır (Scott, MacDonald ve Powers, 2021). JavaScript dilinin gelişmiş DOM fonksiyonlarıyla sayfadaki herhangi bir içerik
kolayca manipüle edilebilir. Yani sayfada var olan bir bileşenin değeri değiştirilebilir, yeni bileşen eklenebilir veya silinebilir.
JavaScript dili fonksiyonel dildir. Fakat aynı zamanda sınıf (class), miras alma (Inhartitance), kapsülleme (Encapsulation), çok biçimlilik
(Polymorphism) gibi Nesneye Yönelik Programlama (Object Oriented Programming – OOP) prensiplerini destekler (Ackermann, 2022). Böylece
JavaScript kodları tekrar kullanılabilir.
JavaScript, tip kontrolü zayıf bir dildir. Değişken tanımlarken veri tipi belirtmek zorunlu değildir. JavaScript dili, değişkenin değerine göre veri tipini
belirler (Svekis ve diğerleri, 2021).
JavaScript, büyük-küçük harfe duyarlıdır. Yani aynı harf sıralamasıyla fakat birinde küçük birinde büyük tanımlanan değişken, fonksiyon vb.
birbirinden farklıdır. Aşağıda örneklenen numara ve NUMARA değişkenleri birbirinden farklı değişkenlerdir.
Zorunluluk olmasa da her komutun bitiminde noktalı virgül operatörü ; kullanılır. Böylece JavaScript motoru komutları birbirinden ayırır ve sırayla
çalıştırır. Ayrıca her bir satır JavaScript tarafından deyim ayıracı olan noktalı virgül gibi değerlendirilir.
JavaScript, basit bir sözdizime sahip ve öğrenmesi kolay bir dildir. Web ve mobil uygulama geliştirme amaçlarıyla kullanılması sayesinde internette
JavaScript ile ilgili çok zengin öğrenme kaynakları bulunmaktadır.
[Link]
[Link]
HTML kodunda içe aktarılan [Link] isimli JavaScript kaynak kod dosyasının içeriği ise aşağıda verilmiştir. Dikkat edilirse [Link] dosyasında
<script> etiketleri yoktur, dosyada doğrudan JavaScript kodu verilmiştir.
Son olarak web tarayıcılarının konsollarında JavaScript kodları çalıştırılabilir. Chrome, Firefox ve Edge tarayıcılarında F12 tuşuna basıldığında
aşağıdaki ekranda verilen Geliştirici Araçları (Developer Tools) paneli açılacaktır. Bu panelin Konsol (Console) sekmesinde JavaScript kodları
yazılıp Enter tuşuna basıldığında tarayıcı JavaScript kodunu çalıştıracaktır.
Eğer konsolda bu örnekteki gibi tek satırlı değil birden fazla satırdan oluşan JavaScript kodları çalıştırılacaksa her bir kod satırından sonra Shift +
basarak Diğer araçlar -> Geliştirici araçları menüsünü tıklamaktır (Chrome için).
Üçüncü yöntem ise tarayıcı açıkken bir sayfada sağ tıklayıp çıkan menüde İncele (Inspect) menüsüne tıklamaktır.
En çok tercih edilen JavaScript kodlama editörleri olarak Visual Studio Code, Atom, WebStorm, Sublime Text, NetBeans ve Eclipse sayılabilir. Bu
kitap kapsamında Visual Studio Code (VS Code) editörü kullanılmıştır. [Link] adresinden işletim sistemine uygun
indirilen dosyaya çift tıklandıktan sonra olarak Lisans Sözleşmesinin kabul onayının istendiği ekran çıkacaktır.
Arzuya göre koyu veya açık tonda tema seçenekleri bulunmaktadır. Göz sağlığı açısından arka planı koyu temaların tercih edilmesi tavsiye
edilmektedir.
Kurulum tamamlandıktan sonra Visual Studio Code editöründe JavaScript kodu çalıştırabilmek için öncelikle bir HTML sayfası oluşturulmalıdır.
Visual Studio Code editörü açıldığında “Hoş Geldiniz” ekranında iken aşağıdaki adımlar sırayla yapılmalıdır.
1.
2.
3. Yeni bir HTML şablonunu hızlıca oluşturmak için SHIFT + 1+ Enter tuşlarına basılır.
Bu işlemden sonra Visual Studio code editörü aşağıdaki HTML şablonunu oluşturacaktır.
ESLint
ESLint uzantısı, önceden yapılandırılmış kurallara dayalı olarak JavaScript kodunu tarayarak analiz eder ve geliştiriciye kodla ilgili iyileştirme
uyarılarında bulunur.
Dilde yerleşik kodlama yapılarının hızlıca yazılmasına imkân verir. Örneğin JavaScript dilindeki for..in döngüsünün sözdizimi aşağıda verilmiştir.
Programcı for..in döngüsünü kullanmak için bu kodları değişkenlere istediği isimleri vererek yazmak zorundadır. JavaScript (ES6) code
snippets eklentisi sayesinde programcı editörde fin yazıp Entera bastığında yukarıda verilen kod otomatik olarak üretilecektir. Programcı bu örnekte
sadece değişkenleri ihtiyacına göre değiştirdiğinde kodu kullanabilecektir. Bu ve benzeri kodlama kısayollarına uzantının dokümantasyonundan
bakılabilir.
Live Server
Bölüm Özeti
Web sayfaları içerik, biçim ve eylem katmanlarından oluşur. İçerik ve yapı HTML ile oluşturulurken CSS ile içeriğin görünümü belirlenir, JavaScript
diliyle de kullanıcının Web sayfasıyla etkileşimi kodlanır. JavaScript dili, Web teknolojilerinde en çok kullanılan ve en popüler programlama dilidir.
JavaScript dilinin söz dizimi basit, öğrenmesi ve kodlaması kolaydır. Büyük-küçük harfe duyarlı, fonksiyonel fakat aynı zamanda çeşitli Nesne
Yönelik Programlama prensiplerini de desteklemektedir. JavaScript tip-güvenli değildir. Değişken ve sabitler tip bildirilmeden tanımlanabilir.
JavaScript ön-uç etkileşimi için tasarlanmışken son yıllarda [Link] ile arka-uç programlama amacıyla da kullanılmaktadır. Ayrıca JavaScript diliyle
geliştirilen React Native, Vue Native gibi frameworkler ile mobil uygulamalar da geliştirilmektedir.
JavaScript dilinin çok amaçlı kullanımı dilin popülerliğini de artırmaktadır. Bu sebeple çok sayıda editör JavaScript diliyle kodlama yapabilme
yeteneğini edinmiştir. Kitap kapsamında basit, hızlı ve kolay kullanım sebebiyle Visual Studio Code editörü tercih edilmiştir.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
Crockford, D. (2008). JavaScript: The Good Parts: The Good Parts (First Edition.). Beijing Köln: O’Reilly Media.
MDN. (2024). Introduction to the server side—Learn web development | MDN. [Link]
side/First_steps/Introduction adresinden erişildi.
[Link]. (2024). [Link]—About [Link]®. 13 Mart 2024 tarihinde [Link] adresinden erişildi.
Özen, Z. (2016). Kimlik Doğrulaması için Tuş Vuruş Dinamiklerine Dayalı Bir Güvenlik Sisteminin Yapay Sinir Ağları ile Geliştirilmesi. (Doktora
Tezi).
Scott, A., MacDonald, M. ve Powers, S. (2021). JavaScript Cookbook: Programming the Web (3rd edition.). Beijing Boston Farnham Sebastopol
Tokyo: O’Reilly Media.
TIOBE. (2024). TIOBE Index. TIOBE. 12 Mart 2024 tarihinde [Link] adresinden erişildi.
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
Cevap-1 :
Soru-2 :
(Çoktan Seçmeli)
(A) UDP
(B) FTP
(C) TCP
(D) SMTP
HTTP
Cevap-2 :
FTP
Soru-3 :
(Çoktan Seçmeli)
(B) Bir HTML sayfası, istemci bilgisayarlara (client) HTTP protokolü ile sunulur.
(C) Tarayıcı (browser), bir web sayfasına erişmek için kullanılan özel programdır.
(D) İstemci bilgisayarlar tarayıcı ile bir web sayfasına ziyaret isteği gönderir.
(E) Sunucu, istemciden gelen isteğe yalnızca .html uzantısına sahip dosyaları döndürür.
Sunucu, istemciden gelen isteğe yalnızca .html uzantısına sahip dosyaları döndürür.
Soru-4 :
Bir web sayfasının yapı ve içeriğinin görünüş ve biçimi aşağıdakilerden hangisi aracılığı ile sistematik biçimde düzenlenebilir?
(Çoktan Seçmeli)
(A) CSS
(B) HTML
(C) URL
(D) HTTP
FTP
Cevap-4 :
CSS
Soru-5 :
(Çoktan Seçmeli)
JavaScript dili CSS ve HTML ile birlikte web geliştirme sürecinde kullanılan bir dildir.
Cevap-5 :
Soru-6 :
(Çoktan Seçmeli)
(B) jQuery
(D) RStudio
Angular
Cevap-6 :
RStudio
Soru-7 :
Bir HTML sayfasına JavaScript kodları aşağıdaki etiketlerden hangisi ile eklenebilir?
(Çoktan Seçmeli)
(B) <jquery></jquery>
(C) <js></js>
(D) <query></query>
(E) <script></script>
Cevap-7 :
<script></script>
Soru-8 :
[Link] adlı JavaScript dosyası aşağıdaki seçeneklerden hangisi ile web sayfasında kullanılabilir?
(Çoktan Seçmeli)
<script sourcefile="[Link]"></script>
Cevap-8 :
<script src="[Link]"></script>
Soru-9 :
(Çoktan Seçmeli)
(B) Atom
(C) WebStorm
(D) JupyterNotebook
Sublime Text
Cevap-9 :
JupyterNotebook
Soru-10 :
“Visual Studio Code editöründe JavaScript kodu çalıştırabilmek için öncelikle .js uzantılı … dosyası oluşturulmalıdır.” ifadesinde … ile gösterilen
yere gelebilecek uygun seçenek aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
(A) JavaScript
(B) HTML
(C) CSS
HTTP
Cevap-10 :
JavaScript
Özlü Söz
“Kariyer hedefleriniz ne olursa olsun kodlamayı öğrenmek faydalıdır.”
– Arianna Huffington
Kazanımlar
1. JavaScript’in temel kavramlarını öğrenir.
8. JavaScript’te kullanılan temel veri tiplerini (sayılar, dizgeler, boolean) tanır ve kullanır.
Birlikte Düşünelim
1. Anahtar kelimelerin görevi nedir?
7. Değişkenler ve sabitler arasındaki fark nedir? Hangi durumlarda hangisini kullanmak gerekir?
Başlamadan Önce
Bu bölümde öncelikle JavaScript dili ve kod mimarisine dair kısa bir giriş yapılmıştır. Ardından dilin anahtar kelimeleri hakkında bilgi verilmiştir.
Kodun okunabilirliğini artırmak için yorum satırlarının kullanımı ele alınmıştır. Tanıtıcı kavramı açıklanmış, değerler başlığında farklı veri türlerinin
(nümerik, dizge, boolean) kullanımı örneklenmiştir. Değişkenlerin kapsamı ve nasıl kullanıldığına dair örnekler verilmiştir. Operatörler konusunda
atama, aritmetik, karşılaştırma ve mantıksal ve diğer operatörler açıklanmış ve operatör önceliği ele alınmıştır. Son olarak JavaScript’te kullanılan
temel veri tipleri (sayılar, dizgeler, boolean) ve bunların nasıl kullanıldığı örneklenmiştir.
2.1. Giriş
Yazım dilinin harf, kelime ve cümlelerden oluşması gibi kaynak kodlar da kendi içinde anlamı olan sembol, kelime ve yapıların belirli bir kural
dahilinde yazılmasıyla oluşur. Yazıdaki satırların vazifesini programlama dillerinde kod satırları görür. Benzer şekilde çok satırdan oluşan
paragrafların programlama dillerindeki muadili kod bloklarıdır denebilir. Kod bloklarını birbirinden ayırmak için paragraftaki girinti yerine süslü
parantezler {} kullanılır. Fakat paragraf içinde paragraf olamazken kod blokları iç içe kullanılabilir.
Aşağıda verilen JavaScript kodunda süslü parantezler içinde if ve else kod bloklarının olduğu görülebilir. Kaynak koddaki girinti ve çıkıntılar, kod
satırları arasında hiçbir kod içermeyen boş satırlar, kod ifadeleri arasındaki boşluklar JavaScript yorumlayıcısı için önemli değildir. Fakat
programcının kodu kolayca okuması için yani kodun okunurluğunu artırmak için girinti ve boşluklar kullanılmalıdır. Visual Studio Code editörü, bir
kod dosyası açıkken Shift + Alt + F tuşlarına basıldığında kaynak kodun okunurluğunu artırmak için biçimlendirir.
Programlama dillerinde bir değeri olan veya çalıştırıldığında bir değer döndüren en kısa kod parçacıklarına ifade (expression) denir. Örneğin aşağıdaki
kodda a = 2, b = 8, a + b ve c > 0 ayrı ayrı birer ifadedir.
Tek başına çalıştırıldığında bir iş yapan kod kısımlarına ise deyim (statement) denir. Aşağıdaki kodda değişken bildirimi ve değer atamasının yapıldığı
let a = 2; let b = 8; iki değişkenin değerinin toplanıp c isminde başka bir değişkene atandığı let c = a + b; birer deyimdir. Ayrıca if koşulu, else
deyimi, konsol ekranına bir değeri çıktılamayı sağlayan [Link](c); metodu birer deyimdir.
Yine yazım dilinde kelimelerin isim, sıfat, fiil gibi işlevlerine göre sınıflandırılmasına benzer şekilde programlama dillerinde de kaynak kodu oluşturan
bileşenler (sembol, sembol çiftleri, kelime ve kelime grupları) işlevlerine göre sınıflandırılmaktadır. JavaScript dilini oluşturan bileşenler işlevlerine
göre aşağıda ayrı başlıklar halinde ele alınmıştır.
JavaScript dilinde tanımlı ECMAScript 5 ve 6 uyumlu anahtar kelimeler Tablo 1’de verilmiştir(ECMAScript, 2023).
JavaScript dilinde tek satırlı ve çok satırlı yorum olmak üzere iki şekilde yorum satırı yapılabilmektedir.
Tek satırlı yorum yan yana iki ters bölü ile // ile yapılmaktadır. Bundan itibaren satır sonuna kadar yazılanları JavaScript yorumlayıcısı dikkate
almayacaktır. Bir editör ile kodlama yapılıyorsa tek satırlı yorum ile yazılanların rengi normal kod satırlarındaki renkten farklı olacaktır. Örneğin
Visual Studio Code editörü seçilen renk temasına bağlı olarak aşağıda yorum satırını yeşil renkle vermiştir.
Yorumlar tek satıra sığmıyorsa çok satırlı yorum kullanılabilir. Çok satırlı yorum /* ve */ arasında yazılmaktadır. Çok satırlı yorum olarak yazılanların
hiçbiri JavaScript yorumlayıcısı tarafından çalıştırılmaz (Ackermann, 2022).
2.4. Tanıtıcılar
Anahtar kelimelerin haricinde değişken, fonksiyon, sınıf gibi bazı programlama yapılarına programcının isim vermesi gerekir. Bir diğer ifadeyle bazı
dil bileşenleri daha sonra kullanılmak üzere çağrılması icap ettiğinde bunlara bir isim vermek gerekmektedir. İşte programcı tarafından verilen bu
isimlere tanıtıcı/tanımlayıcı (identifier) denir (Horstmann, 2020).
Tanıtıcı isimlendirmesi çeşitli kurallar dahilinde yapılmaktadır. İsimlendirme kuralları da denilen bu tanıtıcı kuralları aşağıda örneklerle açıklanmıştır
(Ackermann, 2022; Flanagan, 2020; Horstmann, 2020; Scott, MacDonald ve Powers, 2021; Svekis, Putten ve Percival, 2021).
• Tanıtıcılar büyük-küçük harfe duyarlıdır. Yani aşağıda tanımlanan değişkenlerin hepsi birbirinden farklıdır.
• Aynı kod bloğu kapsamında aynı isimde birden fazla tanıtıcı kullanılamaz. Aşağıdaki kod satırlarında editör x değişkenlerinin altını kırmızı ile
çizerek aynı isimde değişken tanımlanamayacağını belirten “Blok kapsamlı değişken 'x', yeniden bildirilemiyor.” hatası verecektir.
• Tanıtıcılar rakamla başlayamaz, harfle başlamalıdır. Aşağıdaki kod satırı hata verecektir.
• Anahtar kelimeler tanıtıcı olarak kullanılamaz. Örneğin aşağıdaki sabit bildirimi hatalıdır çünkü break JavaScript dilinde anahtar kelimelerden
biridir.
• Tanıtıcılar boşluk, TAB, yeni satır, satır başı gibi karakterleri içeremez. Örneğin aşağıdaki değişken tanımlamaları hatalıdır.
2.5. Değerler
Sayı değeri girmek için (varsayılan onluk taban) 0-9 arası rakamlar kullanılır. Ondalıklı sayılar için ondalık ayıracı olarak virgül değil nokta .
kullanılır.
Çok basamaklı sayıları bilimsel notasyonda yazmak için e veya E harfleri kullanılır.
Sekiz tabanında (oktal) sayı girilecekse sayı sıfırdan sonra O veya o karakteriyle (0O veya 0o) başlamalıdır. Bu durumda girilen sayı on tabanında
değil sekiz tabanında değerlendirilecektir. Sekiz tabanında sayı girerken yalnızca 0-7 arası rakamlar kullanılabilir. Aksi halde kod satırı hata verecektir.
On altı tabanında (heksadesimal veya hex) sayı girilecekse sayı sıfırdan sonra X veya x karakteriyle (0X veya 0x) başlamalıdır. Bu durumda girilen
sayı on tabanında değil on altı tabanında değerlendirilecektir. On altı tabanında sayı girerken 0-9 arası rakamlar ve A-F veya a-f arası harfler
kullanılabilir. Aksi halde kod satırı hata verecektir.
Sayıların işaretini pozitif ve negatif olarak belirtmek için + ve – işaret operatörleri kullanılır.
Karakter, metin, harf ve/veya sayı içeren (alfanümerik) değerler string (dizge) olarak isimlendirilir. JavaScript dilinde dizgeler tek tırnak ' veya çift
tırnak " karakterleri içerisinde yazılır.
JavaScript yorumlayıcısı tırnak içerisinde yazılanları yani bir tırnaktan diğerine kadar olan karakterleri dizge olarak değerlendirecektir. Dizge bittikten
sonra da deyim sonlandırıcı noktalı virgül veya başka bir JavaScript kodu arayacaktır, bulamazsa hata verecektir. Fakat kimi zaman dizgenin içinde
tırnak karakteri olabilir. Örneğin aşağıdaki kod satırında İstanbul'u dizgesinde tek tırnak karakteri yer almaktadır. Bu sebeple kod satırı hata
verecektir.
Bu gibi durumda derleyicinin hata vermemesi için dizgenin içindeki tek tırnaktan önce bölü \ karakteri eklenir. Buna kaçış karakteri denir. Böylece
yorumlayıcı hata vermeyecektir.
Yukarıda örneklenen İstanbul'u dizgesindeki tırnak hatasının giderilmesi için tek tırnaktan önce \ kaçış karakteri eklenmelidir İstanbul\'u. Böylece
kod satırı hata vermeyecektir.
JavaScript dilinde tırnak kaçış karakteri haricinde kullanılan diğer kaçış karakterleri Tablo 2’de verilmiştir (geeksforgeeks, 2023a).
Dizge birden fazla satırdan oluşuyorsa satır sonunda \n verilmelidir. Örneğin aşağıdaki dizge hatalıdır.
ECMAScript 6 ile birlikte JavaScript diline şablon dizge (template string) özelliği gelmiştir. Bu sayede dizgenin içinde tek veya çift tırnak veya yeni
satır olması durumunda kaçış karakteri kullanmadan da dizge olduğu gibi kullanılabilir. Şablon dizgesi eğik tırnak ` ` karakterleri içinde yazılmaktadır
(Svekis ve diğerleri, 2021).
Şablon dizgelerin sağladığı bir diğer kullanım kolaylığı ise değişken ve ifadeleri ${değisken} veya ${ifade} sözdizimiyle doğrudan dizgenin içinde
yazdırabilmesidir (Ackermann, 2022; Horstmann, 2020). Aşağıda bu kullanım örneklenmiştir.
JavaScript dilinde mantıksal bir durumu ifade etmek için true ve false olarak iki tane Boolean değer kullanılır.
Aşağıdaki örnekte x isimli değişkene 5 değeri, ders isimli değişkene JavaScript değeri atanmıştır. z isimli değişken tanımlanmış fakat bir değer
ataması yapılmamıştır. Tanımlanmış fakat değer atanmamış bir değişken undefined değerdedir.
JavaScript dilinde bir değişkene önce nümerik daha sonra String veri tipinde değer atanabilir. Bu açıdan JavaScript sıkı veri tipi kontrolü uygulamaz.
Aşağıdaki satırda önce 5 ve sonra 25 değeri atanan nümerik değerdeki x değişkenine String veri tipinde değer atanmıştır.
Kimi zaman programın ihtiyaç duyduğu verinin daha sonradan değişmemesi istenebilir. Bu gibi durumlarda saklanacak veri değişken ile değil sabit
(constant) ile tanımlanır (Flanagan, 2020). Sabit tanımlama const ile yapılır. Sabit tanımlanırken mutlaka değer ataması da yapılmalıdır aksi halde kod
satırı hata verecektir. Sabitin değeri daha sonra değiştirilmek istendiğinde de kod satırı hata verir.
JavaScript dilinde değişkenler var ve let ile tanımlanırlar. Tanımlanan bir değişken kaynak kodun her yerinde görünür yani kullanılabilir değildir.
Değişkenlerin kullanım alanı yani kapsamı çeşitli kurallara tabidir (javatpoint, 2024; Svekis ve diğerleri, 2021):
Global Değişkenler
Kodun her yerinden erişilebilen değişkenlere global değişkenler denir. var veya window nesnesi ile tanımlanır. Kaynak kodun en üstünde,
fonksiyondan önce ve kod bloğunun üzerinde tanımlanan değişkenler global değişkenlerdir.
Aşağıda verilen örnekte let, var ve window ile kodun en başında üç adet global değişken tanımlanmıştır (globalDegisken1, globalDegisken2,
globalDegisken3). Bu değişkenler tanımlandıktan sonra, bir fonksiyonun içinde ve fonksiyonun dışında görünürdürler yani kullanılabilirler.
Bu kodun konsol çıktısı aşağıda verilmiştir. Çıktıdan görüldüğü üzere global değişkenler her yerde görünürdürler.
Bir fonksiyon içinde tanımlı değişkenler yerel değişkendir (local variable). Yerel değişkenler yalnızca tanımlandığı fonksiyon içinde görünür ve
kullanılır, tanımlandığı fonksiyon dışında yerel değişkenler tanımsızdır dolayısıyla bunlara erişilemez.
Aşağıda verilen örnekte ciktila fonksiyonu içinde let ve var ile iki adet lokal değişken tanımlanmıştır (lokalDegisken, lokalDegisken2). Fonksiyon
daha sonra ciktila(); ile çağrılmıştır. Akabinde fonksiyonun dışında lokal değişkenler çağrılmıştır. Kodun devamında ciktila2 isminde başka bir
fonksiyon tanımlanmış ve bu fonksiyonun içinde de lokal değişkenler çağrılmıştır. Bu JavaScript kodunda lokal değişkenler kendi fonksiyonu içinde
tanımlı ve kendi fonksiyonu dışında tanımsız olduğundan sonraki iki çağırmada hata verecektir. Kodun hata vermemesi için satır sonunda // hata verir
olarak yorumlanan satırlar silinmeli veya satır başına yorum eklenmelidir.
Blok Değişkenleri
Bir blok içinde tanımlı değişkenlerin kapsamı tanımlandığı blokla sınırlıdır. Tanımlandığı blok dışından bu değişkenlere erişilemez.
Aşağıda verilen örnekte süslü parantezlerle verilen blok içinde var ve let ile iki adet değişken tanımlanmış (blokDegisken, blokDegisken2) ve yine
aynı blok içinde değişkenler konsola çıktılanmıştır. Daha sonra blok dışında her iki değişken ayrı ayrı konsola çıktılanmıştır. Kodun devamında farklı
bir blok açılmış ve bu blokta değişkenler yine ayrı ayrı çıktılanmıştır.
var ile tanımlanan değişkenler global kapsamda olduğundan kodun her yerinden bu değişkenlere erişilebilir. Fakat let ile tanımlanan değişkenler blok
kapsamlı değişkenlerdir dolayısıyla tanımlandığı bloğun dışından bu değişkenlere erişilemez. Dolayısıyla bu kod çalıştırıldığında hata verecektir.
Çünkü ilk kod bloğunda blokDegisken2 isimli değişken let ile tanımlanmıştır ve yalnızca kendi bloğu içinden bu değişkene erişilebilir, blok dışından
erişilemez. Kodun hata vermemesi için satır sonunda // hata verir olarak yorumlanan satırlar silinmeli veya satır başına yorum eklenmelidir.
2.7. Operatörler
Operatör (işleyen) özel bir işlevi olan sembol veya sembollerdir. Operatörlerin işlediği, üzerinde bir işlem yaptığı değer veya ifadeye işlenen
(operand) denir. Örneğin 12 / 4 işleminde bölme operatörü kullanılmıştır. Bölme operatörünün sağındaki (4) ve solundaki (12) değerleri bölme
operatörünün işlenenleridir.
JavaScript dilinde operatörler yaptığı işlem kategorisine göre aşağıda örneklerle açıklanmıştır.
Atama operatörü olan eşittir sembolü = kendisinin sağındaki değeri kendisinin sol tarafındaki değişken veya sabite atar (aktarır).
Atama işleminde önce sağ tarafta hesaplanması gereken ifade varsa hesaplanır ve daha sonra hesaplanan değer sol taraftaki değişkene aktarılır.
Aşağıdaki örnekte önce atama operatörünün sağındaki aritmetik işlemin hesabı yapılır ve daha sonra hesaplanan değer sonuc değişkenine atanır.
JavaScript dilinde tek satırda birden fazla değişkene değer atanabilir. Yukarıda verilen kodda sayi1 ve sayi2 değişkenlerine iki ayrı satırda yapılan
atama işi aşağıdaki gibi tek satırda da yapılabilir.
JavaScript dilinde dizi elemanlarının değerleri aynı anda birden fazla değişkene aşağıdaki kullanımdaki gibi atanabilir.
Önceki alt başlıkta ele alındığı üzere değişken, bir değeri saklamak için bellekte ayrılan alanların adresini kolayca hatırlamak için onlara verilen
isimlerdi. Değişkenlerde saklanan değerler adı üzerinde sonradan değiştirilebilir. Örneğin aşağıda a değişkenine önce 10 değeri atanmış, sonraki
satırda ise a değişkenin değeri 2024 olarak değiştirilmiştir.
Kimi zaman bir değişkenin değeri yukarıda verilen örnekteki gibi doğrudan değiştirilmeyebilir. Örneğin sayi isminde bir değişken tanımlansın ve
değişkene 5 değeri atansın.
Daha sonra sayi değişkenine 2 eklensin ve yeni değer yine sayi değişkeninin üzerine yazılsın. Bu iş aşağıdaki kod satırıyla yapılır.
Matematikte geçersiz olan bu denklem programlama dillerinde son derece basit bir atama işleminden ibarettir. Daha önce de ifade edildiği üzere atama
işleminde öncelikle = atama operatörünün sağ tarafındaki işlemler hesaplanır ve daha sonra hesaplanan değer = atama operatörünün sol tarafındaki
değişkene atanır. Bir diğer ifadeyle atama operatörü sağdan sola doğru çalışır. Atama işleminin bu çalışma prensibine göre öncelikle atama
operatörünün sağ tarafındaki işlem yapılır yani 5 değerinde olan sayi değişkenine 2 eklenir ve 7 değeri elde edilir. Daha sonra elde edilen 7 değeri
operatörün sol tarafındaki sayi değişkenine atanır. sayi = sayi + 2; kod satırı çalıştırıldığında JavaScript yorumlayıcısı herhangi bir hata vermeyecektir.
sayi = sayi + 2; kod satırı aşağıdaki gibi daha kısa bir şekilde yazılabilir. Burada kullanılan += bütünleşik atama operatörüdür.
Bir değişkenin değerini değiştirip nihaî değeri yine aynı değişkene atamak için kullanılan bütünleşik atama operatörleri Tablo 3’te verilmiştir.
Bütünleşik atama operatörünün kullanımında önce değişken, sonra ise değişim miktarı verilir. Sözdizimi aşağıda verilmiştir.
Bütünleşik atama operatörleri yalnızca değişkenlerle çalışır, bütünleşik atama operatöründen önce sayı kullanılamaz, mutlaka değişken kullanılmalıdır.
Örneğin aşağıdaki satır hata verecek ve çalışmayacaktır.,
Bir sayının pozitif veya negatif değerde olduğunu belirtmek için sırasıyla + ve – işaret operatörleri kullanılır. İşaret operatörleri sadece kendisinin sağ
tarafına tek bir değer aldıklarından tekli (unary) operatördürler. Günlük kullanımda olduğu üzere eğer sayının önünde herhangi bir işaret operatörü
yoksa o sayı pozitif değerdedir.
JavaScript dilinde temel aritmetik işlemleri yapmak için toplama, çıkarma, çarpma, bölme, mod alma ve üs alma operatörleri tanımlıdır. Aritmetik
operatörler kendisinin sağına ve soluna (her iki tarafa) işlenen aldıklarından ikili (binary) operatördürler. Tablo 4’te JavaScript dilinde ön tanımlı
aritmetik operatörler verilmiştir.
JavaScript dilinde bir değişkenin değerini birer artırıp azaltmak için bütünleşik atama operatörlerine benzer bir artırma ++ ve bir azaltma --
operatörleri kullanılır. Birer artırma ve azaltma operatörleri yalnızca değişkenlerle kullanılır, sayılarla kullanılamaz. Birer artırma ve azaltma
operatörleri kendisinin sağına (sonuna) veya soluna (önüne) değişken alabilir. Bu sebeple bu operatörlerin çıktısı değişkenin bulunduğu yere göre
(önüne veya sonuna göre) değişecektir.
Aşağıda verilen JavaScript kod örneğinde ++ artırma operatörü kendisinden önce değişken almıştır. Önden artırma işlevi gören bu kullanımda ++
operatörü değişkende önce geldiği için öncelikle değer artımı yapılacak ve yeni değer değişkenin üzerine yazılacaktır. Böylece değişken artık yeni
değerde kullanılacaktır. Örnekte x değişkenine 5 değeri atanmıştır. Sonraki satırda x değişkeninin değeri konsola çıktılanmıştır. Bir sonraki satırda ise
önden artırım yapılarak ++x kullanımıyla değişkenin değeri bir artırılmış ve yeni değer değişkenin üzerine yazılmıştır. Bu değer konsola
çıktılandığında 6 çıktısı görülecektir.
Eğer artırma operatörü değişkenden sonra kullanılırsa bu durumda değişken mevcut değeriyle kullanılacak ve kullanıldıktan sonra değeri bir
artırılacaktır.
Aşağıda sondan artırma operatörünün kullanımına ilişkin örnek verilmiştir. İlk satırda x değişkenine yine 5 değeri atanmıştır. Sonraki satırda sondan
artırma operatörü kullanılarak x++ değeri konsola çıktılanmıştır. Bu durumda x değişkeninin mevcut değeri olan 5 kullanılacak ve konsola
çıktılanacaktır. x değişkeninin değeri ancak bu kullanımdan sonra bir artırılacaktır. Bir sonraki satırda yeni değerdeki x değişkeni konsola
çıktılanmıştır. Bu son satırın çıktısı 6 olacaktır.
Önden ve sondan artırma operatörüne benzer şekilde önden ve sondan azaltma operatörü de kullanılabilir (Tablo 7).
İki değerin/işlenenin birbirine göre küçüklük, büyüklük, eşitlik vb. yönlerden ilişkisini karşılaştırmak için kullanılan JavaScript operatörleri Tablo 8’de
verilmiştir. Tabloda verilen son iki operatör her iki tarafına aldığı değer ve işlenenin değerlerini ve ilave olarak veri tiplerini de karşılaştırır, diğerleri
yalnızca değerleri karşılaştırır. Karşılaştırma operatörleri true veya false boolean değerlerden birini döndürür. Örneğin 15 > 12 karşılaştırması true
döndürür.
Operatör Açıklama
> Büyüktür operatörü. Operatörün sol tarafındaki işlenen sağ tarafındakinden büyükse true döner, değilse false döner.
< Küçüktür operatörü. Operatörün sol tarafındaki işlenen sağ tarafındakinden küçükse true döner, değilse false döner.
>= Büyük veya eşittir operatörü. Operatörün sol tarafındaki işlenen sağ tarafındakinden büyük veya eşitse true döner, değilse false
döner.
<= Küçük veya eşittir operatörü. Operatörün sol tarafındaki işlenen sağ tarafındakinden küçük veya eşitse true döner, değilse false
döner.
== Eşitlik kontrol operatörü. Operatörün her iki tarafındaki işlenenler birbirine eşitse true döner, eşit değilse false döner.
!= Eşit olmama kontrol operatörü. Operatörün her iki tarafındaki işlenenler birbirine eşit değilse true döner, eşitse false döner.
=== Hem değerler hem de veri tipleri eşitlik kontrol operatörü. Operatörün her iki tarafındaki işlenenler birbirine eşitse ve aynı zamanda
bu işlenenlerin veri tipleri de aynı türdeyse true döner, değilse false döner.
!== Hem değerler hem de veri tipleri eşit olmama kontrol operatörü. Operatörün her iki tarafındaki işlenenler birbirine eşit değilse ve
aynı zamanda bu işlenenlerin veri tipleri de eşit değilse true döner, eşitse false döner.
Mantıksal operatörler her iki tarafına aldığı değerlere mantıksal VE (&&), VEYA (||), DEĞİL (!) mantıksal kapılarını uygular. İşlem sonucu true veya
false döner.
Operatör İşlev
&& VE mantıksal kapısı
|| VEYA mantıksal kapısı
! DEĞİL mantıksal kapısı
JavaScript dilinde herhangi bir kategoriye girmeyen çeşitli operatörler kullanılmaktadır (Ackermann, 2022; Svekis ve diğerleri, 2021):
typeof Operatörü
typeof operatörü sağ tarafına aldığı değerin veri tipini geri döner. Aşağıda çeşitli değerlerin veri tipleri typeof operatörüyle elde edilmiş ve konsol
ekranına çıktılanmıştır.
delete operatörü
delete operatörü dizi elemanını veya nesnenin bir özelliğini (bileşenini) siler.
in operatörü dizi içinde verilen indiste bir anahtar olup olmadığını veya bir object içinde verilen anahtar olup olmadığını kontrol eder. Eğer varsa true
döner, yoksa false döner.
instanceof operatörü
instanceof operatörü sol tarafına aldığı değerin sağ tarafına aldığı veri tipinde olup olmadığını kontrol eder. Örnek belirtilen türdeyse true, değilse
false döner.
new operatörü
Virgül Operatörü
Spread Operatörü
Yan yana üç nokta … ile yazılan spread operatörü dizi elemanlarının tamamını kopyalar. Spread operatörü genellikle dizileri birleştirmek için
kullanılır. Aşağıdaki örnekte ikinci satırda tumSayilar isminde bir dizi tanımlanmış ve bu diziye ciftSayilar dizisinin tüm elemanları … Spread
operatörü ile kopyalanmış ve dizinin en sonuna 8 değerindeki eleman eklenmiştir.
Aşağıda Spread operatörünün fonksiyon parametresinde kullanımı örneklenmiştir. sayilar isimli fonksiyon sayi1, sayi2 ve geriKalanParametreler
adında üç parametre almıştır. Dikkat edilirse geriKalanParametreler isimli parametre üç nokta Spread operatörüyle tanımlanmıştır. Fonksiyonun
içinde geriKalanParametreler parametresinin değerleri konsola çıktılanmıştır. Akabinde sayilar isimli fonksiyona parametre olarak 1, 8, 34 ve 2024
değerleri verilmiştir. Konsol çıktısında 34 ve 2024 değerlerinin yer aldığı görülecektir. Çünkü fonksiyona verilen değerlere göre sayi1 parametresi 1
değerini, sayi2 parametresi 8 değerini, geriKalanParametreler parametresi ise fonksiyona verilen diğer değerlerin yerine (34 ve 2024) geçmektedir.
Koşullu operatör if-else koşul yapısının daha kısa ifadeyle yazımıdır. Koşullu (üçlü) operatör (diğer adı ternary operatör) üç tane işlenen alır. Aşağıda
sözdizimi verilmiştir.
Koşullu operatör bir koşulu kontrol eder. Eğer koşul true döndürürse değer1 kullanılır, eğer koşul false dönerse değer2 kullanılır. Aşağıda verilen kod
örneğinde kullanıcının yaşı istenmektedir. Eğer kullanıcının yaşı 18’den küçükse sisteme kaydolamayacağı, 18 veya büyükse sisteme kaydolabileceği
bilgisi ekrana çıktılanmaktadır. Aşağıdaki satırda verilen koşullu operatör bu durumun kontrolünü sağlamaktadır.
Bir dizgeyi diğerinin sonuna eklemek için (dizgeleri uç uca birleştirmek için) + dizge birleştirme operatörü kullanılır.
null birleşim operatörü ?? her iki tarafına değer alır. Eğer sol tarafındaki değişkene değer atanmışsa o değeri kullanır. Eğer sol tarafındaki değişkene
henüz bir değer atanmamışsa veya undefined ise sağ taraftaki değeri kullanır. Örneğin kullanıcının bir ürün sipariş ettiğini düşünelim. Eğer kullanıcı
sipariş esnasında miktar alanına değer girmemişse 1 tane aldığını varsaymalıyız; miktar alanına değer girmişse de onu kullanmalıyız. Bunu sağlamak
için null birleşim operatörü ?? kullanılmalıdır. Aşağıda bunun örneği verilmiştir.
Eğer kullanıcı miktar alanına değer girmişse bu durumda sipariş miktarı olarak 1 değil girdiği değer kullanılacaktır. Örneğin kullanıcı 2 tane sipariş
etmişse siparisMiktari degişkenine 2 değeri atanacaktır.
Matematikteki işlem önceliği kuralları JavaScript dilinde de geçerlidir. Örneğin toplama ve çarpma işlemlerinin olduğu bir aritmetik hesaplamada önce
parantezlerin içinden hesaplamaya başlanır, parantez içinde ise önce çarpma işlemi ve ardından toplama işlemi yapılır. Bu ve benzeri şekilde
operatörlerin birbirine göre öncelik ilişkisi aşağıda Tablo 10’da verilmiştir (geeksforgeeks, 2023b). Tabloda verilen operatörlerde en yukarıdaki en
öncelikli işlem sırasındadır ve aşağıya doğru işlem önceliği azalır. Tablo incelendiğinde sondan artırma operatörünün önden artırma operatörüne göre
öncelikli olduğu, üs alma operatörünün çarpma operatörüne göre öncelikli olduğu görülecektir.
1. String
2. Number
3. Bigint
4. Boolean
5. Undefined
6. Null
7. Symbol
8. Object
Aşağıda verilen Tablo 11’de JavaScript veri tipleri kısaca tanımlanmış ve örneklenmiştir.
Symbol veri tipi ise ECMAScript 6 ile dile kazandırılmıştır. Symbol veri tipinde tanımlanan değerin eşsiz olduğunu belirtir. Yukarıda örneklenen
dersKodu isminde Symbol veri tipinde tanımlanan değişkenle aynı değerde yine Symbol veri tipinde dersKodu2 isminde başka bir değişken
tanımlayalım ve daha sonra bu iki değişkenin değerlerinin ve veri tiplerinin eşitlik kontrolünü (üç tane = operatörü ile) yapalım. Aşağıda verilen
JavaScript kodu çalıştırıldığında konsol çıktısında false görülecektir çünkü Symbol veri tipindeki değerler eşsiz yani benzersizdir. Dolayısıyla Symbol
veri tipindeki değerler başka hiçbir değerle eşit olamayacağından eşitlik kontrolü false döndürecektir.
Kodun içinde derleyici veya yorumlayıcının dikkate almaması gereken açıklama metinleri yorum satırları olarak verilir. JavaScript tek satırlı ve çok
satırlı yorum yapılmasına izin verir.
Tanıtıcılar, çeşitli programlama yapılarına programcı tarafından verilen isimlerdir. Değerler bir değişkene, fonksiyona vb. aktarılan numerik string,
boolean değerleri ifade eder.
Değişkenler bir değeri saklamak için kullanılırlar. Adı üzerinde değişkenlere atanan değerler sonradan değiştirilebilir Sabitlerin değeri ise sonradan
değiştirilemez. Sabitler tanımlanırken mutlaka bir değerle birlikte tanımlanmalıdır.
Operatörler bir değer üzerine işlem yapan özel anlamı olan semboller veya kelimelerdir. Operatörlerin etki ettiği yapılara operand denir.
JavaScript dilinde 8 farklı veri tipi bulunmaktadır. Gereksinime ne ise ona uygun veri tipleri kullanılmalıdır.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
ECMAScript. (2023). Keywords and Reserved Words. ECMAScript® 2023 Language Specification. [Link]
and-reserved-words adresinden erişildi.
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
Horstmann, C. (2020). Modern JavaScript for the Impatient (1st edition.). Boston Columbus New York San Francisco Amsterdam Cape Town:
Addison-Wesley Professional.
Scott, A., MacDonald, M. ve Powers, S. (2021). JavaScript Cookbook: Programming the Web (3rd edition.). Beijing Boston Farnham Sebastopol
Tokyo: O’Reilly Media.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
Cevap-1 :
Süslü parantezler {}
Soru-2 :
(Çoktan Seçmeli)
(A) for
(B) if
(C) let
(D) this
(E) that
Cevap-2 :
that
Soru-3 :
(Çoktan Seçmeli)
(A) let x = 5;
Cevap-3 :
Soru-4 :
(Çoktan Seçmeli)
Cevap-4 :
Aşağıda boş bırakılan kod satırında kişinin ad ve yaş değişkenlerini barındıran bilgi isminde bir değişken tanımlanmak isteniyor. Aşağıda verilen
seçeneklerin hangisiyle bu yapılabilir?
let ad = "Ahmet";
[Link](bilgi);
(Çoktan Seçmeli)
(A) let bilgi = `Ad: /{ad}, Yaş: /{yas}, Bilgi: /{ad} /{yas} yaşındadır.`;
(B) let bilgi = `Ad: #{ad}, Yaş: #{yas}, Bilgi: #{ad} #{yas} yaşındadır.`;
(C) let bilgi = `Ad: *{ad}, Yaş: *{yas}, Bilgi: *{ad} *{yas} yaşındadır.`;
(D) let bilgi = `Ad: ${ad}, Yaş: ${yas}, Bilgi: ${ad} ${yas} yaşındadır.`;
let bilgi = `Ad: %{ad}, Yaş: %{yas}, Bilgi: %{ad} %{yas} yaşındadır.`;
Cevap-5 :
let bilgi = `Ad: ${ad}, Yaş: ${yas}, Bilgi: ${ad} ${yas} yaşındadır.`;
Soru-6 :
Değişken kapsamını dikkate alarak aşağıdaki JavaScript kodunda tanımlanan değişkenlerden hangisi bu yönüyle diğerlerinden farklıdır?
(Çoktan Seçmeli)
(A) sayi1
(B) sayi2
(C) sonuc
(D) metin
PI
Cevap-6 :
sonuc
(Çoktan Seçmeli)
(A) 14
(B) 15
(C) 16
(D) 17
18
Cevap-7 :
15
Soru-8 :
Aşağıdaki JavaScript kodlarına göre sonuc değişkeninin değeri hangi seçenekte doğru verilmiştir?
(Çoktan Seçmeli)
(A) "true"
(B) "false"
(C) true
(D) false
Cevap-8 :
true
Soru-9 :
Aşağıda verilen kod satırlarıyla ile ilgili verilen ifadelerden hangisi doğrudur?
(Çoktan Seçmeli)
(A) meyveler dizisinin "çilek" elemanı silinmiştir; ancak dizinin uzunluğu aynı kalacaktır.
(B) meyveler dizisinin "muz" elemanı silinmiştir; ancak dizinin uzunluğu aynı kalacaktır.
(C) meyveler dizisinin "çilek" elemanı silinmiştir; dizinin uzunluğu bir eksilmiştir.
Cevap-9 :
meyveler dizisinin "çilek" elemanı silinmiştir; ancak dizinin uzunluğu aynı kalacaktır.
Soru-10 :
(Çoktan Seçmeli)
(A) % Mod
(E) Çarpma
Cevap-10 :
Çarpma
Özlü Söz
“Programlama, başka bir insana bilgisayarın ne yapmasını istediğini söyleme sanatıdır.”
– Donald Knuth
Kazanımlar
1. JavaScript dilinde kullanılan koşul yapılarını bilir ve kod akışını kontrol etmek için koşul yapılarını kullanmayı öğrenir.
2. Belirli bir koşulun doğruluğunu kontrol etmek için “if” koşul yapısını kullanır ve kodun belirli bloklarının çalıştırılmasını sağlar.
3. Bir koşulun gerçekleşmeme durumuna bağlı olarak istenen kod bloklarının çalıştırılması için “if-else” koşul yapısını kullanır.
4. Birden fazla koşulun kontrol edilmesi gerektiğinde “if-else if” koşul yapısını kullanarak kodun akışını yönlendirir ve okunabilirliğini artırır.
5. Birden çok seçenek arasından birinin seçilmesi gerektiğinde “switch” koşul yapısını kullanır.
6. Üçlü koşul operatörü “ternary” bilir ve kullanır.
Birlikte Düşünelim
1. Koşul yapıları JavaScript’te neden önemlidir?
2. “if” koşul yapısının kullanım alanları nelerdir? Birkaç örnek veriniz.
3. “if-else” koşul yapısı nasıl çalışır?
4. “if-else if” koşul yapısının “if-else” yapısından farkı nedir? Hangi durumlarda kullanılır?
5. “switch” koşul yapısı hangi durumlarda tercih edilir? Bir örnek veriniz.
6. “Ternary” operatörü nedir ve nasıl kullanılır? Örnek vererek açıklayınız.
Başlamadan Önce
Koşul yapısı, belirli koşullar altında hangi kod satırı veya kod bloklarının çalıştırılacağını ve kodun akışını yönlendirmede kullanılan önemli bir
programlama bileşenidir. Bu bölümde koşul yapılarının farklı türleri ele alınmıştır. İlk olarak “if” koşul yapısı incelenmiştir. “if” koşul yapısı, belirli
bir koşulun doğruluğunu kontrol eder ve koşulun doğru olması durumunda belirli bir kod bloğunu çalıştırır. Ardından, “if-else” koşul yapısı ele
alınmıştır. Bu yapı ise bir koşulun doğru olup olmadığını kontrol eder ve koşul doğruysa bir kod bloğunu aksi halde başka bir kod bloğunu çalıştırır.
“if-else if” yapısı, birden fazla koşulun kontrol edilmesi gerektiğinde kullanılır ve kodun okunabilirliğini artırır. “switch” yapısı, birden çok koşulun
kontrol edilmesi gerektiğinde tercih edilir ve belirli bir koşula göre farklı kod bloklarını çalıştırır. Son olarak üçlü koşul olarak bilinen “ternary”
operatörünün kullanımıyla ilgili bilgi verilmiştir.
Örneğin bir e-ticaret sitesindeki ürünlerin altında stok miktarları verilsin. Bir kullanıcı istediği herhangi bir üründen kaç adet aldığını yazarak veya
seçerek sipariş etsin. Eğer kullanıcının sipariş adedi ürünün stok miktarının altındaysa siparişin alındığı kullanıcıya bildirilmelidir. Eğer kullanıcının
girmiş olduğu sipariş adedi ürünün stok miktarının üzerindeyse kullanıcıya stok miktarının üzerinde sipariş yapamayacağı bildirilmelidir. Görüldüğü
üzere bu örnekteki bildirim mesajları kullanıcının ürün sipariş sayısına ve o ürünün stok miktarına göre değişmektedir. Programlamada bu ve benzeri
durumlar koşul yapılarıyla gerçekleştirilir. Koşul sağlanmışsa ilgili koşula ait kodlar çalıştırılır, sağlanmazsa çalıştırılmaz.
JavaScript dilinde if, if-else, if-else if ve switch koşul yapıları kullanılmaktadır. Ayrıca if-else koşul yapısının daha kısa yazımı olan ternary
operatörü de kullanılmaktadır (Svekis, Putten ve Percival, 2021).
Bir koşula bağlı olarak çalıştırılması gereken kodlar için if koşul yapısı kullanılır. if koşul yapısı koşulun gerçekleşip gerçekleşmediğini veya koşulun
sağlanıp sağlanmadığını kontrol eder. Eğer koşul sağlanıyorsa (koşul true dönmüşse) koşula bağlı olan kodlar çalıştırılır.
Eğer koşul sağlanıyorsa ilgili koşula bağlı süslü parantezlerin arasındaki (kod bloğundaki) kodlar çalıştırılır. Koşul sağlanmazsa bu durumda koşula
bağlı kodlar çalıştırılmaz ve yorumlayıcı kodun akışını süslü parantezden sonraki kod satırına verir (Flanagan, 2020).
Örneğin aşağıdaki JavaScript kodunda sayi isminde bir değişken tanımlanmış ve 10 değeri atanmıştır. Sonraki satırda sayi değişkeninin değerinin
5’ten büyük olduğu if koşul yapısıyla kontrol edilmiştir. Koşul sağlanmışsa konsola “Sayı beşten büyüktür.” yazdırılacaktır. 10 sayısı 5’ten büyük
olduğundan koşul sağlanacaktır.
Bir başka örnekte kullanıcıdan bir sayı girmesini isteyelim. Girilen sayı çift ise sayfada sayının çift olduğu yazdırılsın. Aşağıda bu problemin HTML
ve JavaScript kodu verilmiştir. Sayı girilmesi için sayi_Alani adında bir input form elemanı oluşturulmuştur. Kullanıcı sayı girdikten sonra kontrol
edilmesi için Sayı Kontrol ismindeki butona basması gerekmektedir. Butonun click olayına bağlı olarak sayiyiKontrolEt() isimli fonksiyon
çalıştırılacaktır. Fonksiyonda kullanıcının girdiği değer parseInt() fonksiyonuyla sayı veri tipine dönüştürülmüştür. Sonraki if koşul yapısında sayının
2’ye göre modu alınmıştır. Kalan değer 0 ise sayi_Durumu isimli div alanına Çift yazdırılmıştır.
if koşul yapısı bir koşulu kontrol eder ve eğer koşul sağlanıyorsa o koşula bağlı ilgili kodları çalıştırırdı. Fakat gerçek hayat problemlerinde iki veya
daha fazla durum söz konusudur. Böyleyken ilk durumun gerçekleşmemesi halinde diğer duruma bağlı kodların çalıştırılması için else deyimi
kullanılır. else deyimi koşul almaz (Horstmann, 2020). Sadece if koşul yapısında verilen koşulun sağlanmaması durumunda hangi kodların
çalıştırılacağı else ile bildirilir. if-else koşul yapısının sözdizimi aşağıda verilmiştir.
if koşul yapısında örneklenen problemi ele alalım. Eğer kullanıcının girmiş olduğu sayı çift ise sayfaya sayının çift olduğu yazdırılıyordu. Fakat sayı
tek ise ne yapılacağı belirtilmemişti. İşte bu ikinci durumda yani sayı tek ise ne yapılacağı else deyimiyle ile verilir. Aşağıda bu işi gerçekleştiren
kodlar if-else koşul yapısı ile verilmiştir. Her iki örnekteki sayfa yapısı aynı olduğu için HTML kodları verilmeyip yalnızca sayiyiKontrolEt()
fonksiyonunun içi verilmiştir.
if koşul yapısında bir duruma ait koşul kontrol edilmekteydi. if-else koşul yapısında ise iki duruma ait koşullar verilir. Öte yandan ikiden fazla durum
söz konusuysa bunların her birine ait kodlar if-else if koşul yapısıyla verilir. if-else if koşul yapısının sözdizimi aşağıda verilmiştir. Sözdizimde iki adet
else if koşul yapısı verilmiştir fakat probleme bağlı olarak else if koşul yapılarının sayısı artırılabilir. Sözdizimin en sonunda verilen else deyimi isteğe
bağlı olarak bulunur (Ackermann, 2022). Yani else deyiminin if-else if koşul yapısında bulunması zorunlu değildir.
Sayının durumuna bağlı olarak ekrana tek veya çift yazdıran problemi tekrar ele alalım. Bu problemde sayının iki durumuna (tek veya çift olması)
ilişkin kodlar if-else ile verilmişti. Fakat sayının sıfır olma durumu ayrıca işlenecek olursa üç durumlu bu problemi çözebilmek için if-else if-else
koşul yapısı kullanılmalıdır. Ele aldığımız bu problem if ve if-else bölümündeki örneğinin aynısı olduğundan yalnızca sayiyiKontrolEt()
fonksiyonunun içi verilmiştir. JavaScript kodu incelendiğinde ilk koşul yapısı if ile verilmiş, ikinci ve üçüncü duruma ait koşullar else if koşul
yapısıyla verilmiştir.
İki veya daha fazla durum söz konusu ise if – else if koşul yapısı kullanılmalıydı. switch deyimi de benzer şekilde çoklu durumlarda kullanılan koşul
yapılarından biridir. Sözdizimi aşağıda verilmiştir (Ackermann, 2022). switch deyiminde ifade kontrol edilir. İfadeyle eşleşebilecek değerler case ile
verilir. JavaScript yorumlayıcısı ifadenin sonucu yukarıdan aşağıya case değerlerinde sırayla kontrol eder. Eşleşen case değerine bağlı kodlar
çalıştırılır. İlgili kodların bittiğini ifade etmek break anahtar kelimesi kullanılır. İfade hiçbir case değeriyle eşleşmezse en sonda verilen default
bloğundaki kodlar çalıştırılır. default bloğunun bulunması zorunlu değildir.
switch deyimini anlamak için kullanıcıdan bir sayı girmesini isteyelim. Girilen sayı sıfırsa ekrana sıfır yazdırsın, çift ise ekrana çift yazdırsın, tek ise
Eğer birden fazla case değerine bağlı olarak aynı kodlar çalıştırılacaksa bu case değerleri alt alta verilir ve devamında buna bağlı çalışacak ilgili kodlar
yazılır. Bu kullanımı örneklemek için kullanıcıdan bir gün yazmasını isteyelim. Bir buton ile yazılan gün kontrol edilsin. Butona basıldığında yazılan
gün hafta içi bir gün ise ekrana “Hafta İçi” yazdırsın. Girilen gün Cumartesi veya Pazar ise ekrana “Hafta Sonu” yazdırsın. Herhangi bir gün adı
girilmemişse “Gün girilmedi” yazdırsın. Aşağıda bu problemin switch deyimiyle çözümünü içeren kodlar verilmiştir.
Üçlü koşul operatörü (diğer adı ternary operatör) if-else koşul yapısının daha kısa ifadeyle yazımıdır. ternary operatörü üç tane işlenen alır. Aşağıda
sözdizimi verilmiştir.
ternary operatörü bir koşulu kontrol eder. Eğer koşul true döndürürse değer1 kullanılır, eğer koşul false dönerse değer2 kullanılır.
if-else koşul yapısında da örneklenen sayının durumuna bağlı olarak ekrana tek veya çift yazdıran problemin ternary operatörü ile çözümü aşağıda
verilmiştir. Ele aldığımız bu problem if ve if-else bölümündeki örneğinin aynısı olduğundan yine yalnızca sayiyiKontrolEt() fonksiyonunun içi
verilmiştir.
Bölüm Özeti
Kaynak kodlar yukarıdan aşağıya doğru sırayla çalıştırılır. Fakat kimi zaman duruma göre bazı kodların çalışıp bazılarının çalışmaması gerekebilir.
Koşul yapıları adı üzerinde bir koşula bağlı olarak istenen kodların çalıştırılması için kullanılır.
Tek bir durum söz konusuysa if koşul yapısı kullanılır. if koşul yapısı bu durumun koşulunu kontrol eder. Eğer koşul sağlanıyorsa yani true ise koşula
Eğer iki durum söz konusuysa ve ilk duruma bağlı koşul sağlanmamışsa ikinci duruma ilişkin kodların çalışması isteniyorsa if-else koşul yapısı
kullanılır.
İkiden fazla durum söz konusuysa her bir duruma ait koşulların kontrol edilmesi için if-else if koşul yapısı kullanılır. Durum sayısına göre else if koşul
sayısı değişir.
Bir diğer koşul yapısı olan switch ise if-else if koşul yapısına benzemektedir. switch deyiminde bir ifade kontrol edilir. İfadeyle eşleşebilecek değerler
case deyimiyle verilir. İfadeyle eşleşen case deyimine bağlı kodlar çalıştırılır, diğer case deyimleri çalıştırılmaz. break deyimi, case bloğundan
çıkmak için kullanılır. Eğer switch yapısında kontrol edilen ifade hiçbir case değeriyle eşleşmezse default ile verilen blok çalıştırılır. default bloğu,
else deyimiyle aynı işlevdedir. default bloğunun switch deyiminde bulunması zorunlu değildir.
Son olarak if-else deyimiyle aynı işlevi gören üçlü koşul operatörü olan ternary operatörü de JavaScript dilinde kullanılmaktadır.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
Horstmann, C. (2020). Modern JavaScript for the Impatient (1st edition.). Boston Columbus New York San Francisco Amsterdam Cape Town:
Addison-Wesley Professional.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
(A) if
(B) if-else
(C) if-else if
(D) if-elif
switch
Cevap-1 :
if-elif
Soru-2 :
Aşağıda verilen JavaScript koduna göre konsolda çıktılanan değer hangi seçenekte doğru verilmişir?
(A) &
(B) ^
(C) ?
(D) $
Cevap-2 :
Soru-3 :
(Çoktan Seçmeli)
Soru-4 :
Bir dersin geçme notu aşağıdaki Javascript kodları ile belirlenmektedir. Buna göre; eğer bir öğrencinin notu 82 ise ekrana yazdırılacak ifade hangi
seçenekte doğru şekilde verilmiştir?
(Çoktan Seçmeli)
(A) Notunuz: A
(B) Notunuz: B
(C) Notunuz: C
(D) Notunuz: D
Notunuz: F
Cevap-4 :
Notunuz: B
Soru-5 :
(Çoktan Seçmeli)
Cevap-5 :
Soru-6 :
VE operatörü
Cevap-6 :
Ternary operatörü
Soru-7 :
Tanımlanan bir gun değişkeninin değerine göre, hafta içi, hafta sonu veya geçersiz gün olarak gunAdi değişkeni atanması ve konsola yazdırılması
isteniyor. Bunu gerçekleştirmek için JavaScript dilinde kullanılabilecek en uygun yapı aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
(A) if
(B) if-else
(C) else
(D) ternary
(E) switch
Cevap-7 :
switch
Soru-8 :
Aşağıdaki if-else koşul yapısının ternary operatörü eşleniği seçeneklerin hangisinde doğru olarak verilmiştir?
(Çoktan Seçmeli)
Cevap-8 :
(Çoktan Seçmeli)
(A) "Merhaba"
"Merhaba, !"
Cevap-9 :
"Merhaba, JavaScript!"
Soru-10 :
(Çoktan Seçmeli)
(A) if-else koşul yapısı, bir koşulun doğru olup olmadığını kontrol etmek için kullanılır.
(B) switch-case yapısı, bir ifadenin değerlerini kontrol etmek için kullanılır.
(C) Ternary operatörü, koşullu ifadelerin kısa bir şekilde yazılmasını sağlar.
(D) if-else koşul yapısında if koşulu false dönerse, else bloğu içindeki satırlar çalıştırılır.
(E) Koşul ifadeleri, sadece tek bir koşulun kontrol edilmesini sağlar.
Cevap-10 :
Özlü Söz
“Kodlama sadece kod değildir, gurur duymamız gereken canlı bir şeydir.”
– Daniel Wellman
Kazanımlar
1. JavaScript dilinde döngü yapılarının önemini kavrar ve belirli işlemlerin tekrarlanmasını sağlamak için döngülerin kullanımını öğrenir.
2. Farklı döngü türlerini tanır ve bu türlerin nasıl kullanıldığını öğrenir.
3. “for” döngüsünün çalışma prensibini ve “for” döngüsünü kullanmayı bilir.
4. “while” döngüsünün işleyişini kavrar ve hangi durumlarda kullanılacağını bilir.
5. “do-while” döngüsünün nasıl çalıştığını ve neden kullanıldığını bilir.
6. Nesnelerin özellikleri/anahtarları üzerinde gezinmek için “for..in” döngüsünü kullanmayı öğrenir ve bu döngünün nasıl uygulandığını bilir.
7. Dizi elemanları üzerinde gezinmek için “for..of” döngüsünü kullanmayı öğrenir ve bu döngünün nasıl kullanıldığını bilir.
8. İç içe döngülerin kullanımını anlar ve gerektiği durumda iç içe döngüleri nasıl kullanabileceğini bilir.
9. “break” ve “continue” döngü kontrol komutlarını öğrenir ve döngülerin akışını yönlendirmek için bunların nasıl kullanıldığını bilir.
Birlikte Düşünelim
1. Döngüler hangi durumlarda kullanılır?
2. Hangi durumlarda “for” döngüsü tercih edilir?
3. “while” döngüsüyle “do-while” döngüsü arasındaki temel fark nedir?
4. Bir dizideki elemanlara erişmek için “for..in” döngüsü ne zaman kullanılabilir?
5. “for..of” döngüsü hangi tür veri yapıları üzerinde çalışır ve nasıl kullanılır?
6. İç içe döngü kullanımı nedir?
7. “break” ve “continue” döngü kontrol komutları hangi durumlarda kullanılır?
Başlamadan Önce
Döngü yapıları, belirli işlemlerin tekrarlanmasını sağlamak için kullanılır. Bu bölümde JavaScript dilinde döngülerin çeşitleri ve kullanımları ele
alınmıştır. İlk olarak “for” döngüsü incelenmiştir. Döngünün kaç kere tekrarlanacağı biliniyorsa genellikle “for” döngüsü kullanılır. “while” döngüsü
bir koşul doğru olduğu müddetçe belirli bir kod bloğunun tekrar çalıştırılmasını sağlar. “do-while” döngüsü ise kod bloğunu en az bir kere çalıştırmak
için kullanılır ve ardından koşul kontrol edilir. “for..in” ve “for..of” döngüleri, nesnelerin veya dizilerin elemanlarını üzerinde gezinmek için kullanılır
ve farklı kullanım alanlarına sahiptir. Bu bölümde ayrıca iç içe döngülerin kullanımı örneklenmiştir. Son olarak döngü akışını yönlendirmek için
kullanılan “break” ve “continue” döngü kontrol komutları ele alınmıştır. “break” komutu bir döngüyü sonlandırmak için kullanılırken, “continue”
komutu döngünün bir sonraki iterasyona atlamasını sağlar.
Döngünün her tekrarına iterasyon denir (Ackermann, 2022). Döngünün kaç kere tekrarlandığını sayan döngü indisi veya döngü sayacı (kısaca sayaç)
kullanılır. Döngünün her iterasyonunda sayaç değeri bir artırılır.
Döngülerin belirli bir tekrardan sonra sonlanması gerekir, aksi halde döngüler sürekli çalışacaktır. Döngülerin istenildiği kadar çalışmasını sağlamak
için bir koşul gerekir (Flanagan, 2020). Bu koşul sağlandığı müddetçe döngü çalışır, sağlanmadığında döngü sonlanır. Döngüler sınıflandırılırken
koşulun baştan kontrol edildiği döngüler ve koşulun sonda kontrol edildiği döngüler olarak da tasnif edilmektedir. for döngüsünde ve while
döngüsünde koşul başta kontrol edilir. do-while döngüsünde ise koşul sonda kontrol edilir. Koşulun başta kontrol edildiği döngülerde eğer koşul
sağlanmıyorsa döngü hiç çalışmaz, koşul sağlanıyorsa döngü çalışır. Özetle döngü yapıları koşul sağlandığı müddetçe çalışır. JavaScript dilinde çok
sayıda eleman veya alan içeren dizi, object gibi yapıların eleman veya alanlarını sırayla kolayca işlemek için for..in ve for..of döngüleri de
bulunmaktadır.
Döngünün kaç kere çalışacağının bilindiği durumlarda for döngüsü kullanılır. for döngüsünün sözdizimi aşağıda verilmiştir (Horstmann, 2020).
Sözdizimden de görüleceği üzere for döngüsü başlangıç, koşul ve değişim olmak üzere üç bileşenden oluşur. Bileşenler arasında noktalı virgül ;
kullanılır.
Başlangıç: for döngüsünün başlangıç değerini belirtir. Sadece döngünün başlangıcında bir kere çalıştırılır.
Koşul: Döngünün çalışmaya başlaması için ve döngünün kaç kere çalışacağını kontrol etmek için gereken koşuldur. Bu koşul hem döngüye başlarken
hem de döngünün her iterasyonunda kontrol edilir. Koşul sağlanmazsa döngüye hiç girilmez. Eğer koşul sağlanıyorsa döngü çalıştırılır. Döngünün her
iterasyonunda da koşulun sağlanıp sağlanmadığı kontrol edilir. Koşul sağlanmadığında da döngü sonlandırılır.
Değişim: Değişim bileşeninde döngü sayaç değerinin her iterasyonda ne kadar değişeceği verilir. Bu değişim pozitif veya negatif olabilir. Değişim
değeri her iterasyonda çalıştırılır.
Örneğin 1’den 10’a kadar birer artan sayıların toplamını bulmak isteyelim. Bu problem için for döngüsü idealdir. Çünkü döngünün hem başlangıç hem
de bitiş değeri yani döngünün kaç kere tekrar edeceği bilinmektedir. Bu durumda for döngüsünün başlangıç değeri 1, bitiş değeri de 10’dur. Yani
döngü 10 kere çalışacaktır. Döngünün bitiş değeri i <= 10 olarak döngü koşulunda verilmiştir. Döngünün değişim parametresi ise döngünün birer birer
artması istendiği için +1’dir. Bu sebeple değişim miktarı i++ olarak verilmiştir. Verilen problemde sayıların toplamını tutmak için ayrıca bir değişken
tanımlamak gerekmektedir, bu sebeple toplam isimli değişken tanımlanmıştır. Aşağıda bu problemin JavaScript kodu verilmiştir.
for döngüsü incelendiğinde döngü indisi olarak i değişkeni kullanılmıştır. Dikkat edilirse i değişkeni daha önce tanımlanmamıştır. Döngü indisinin
daha önce tanımlanmasına gerek yoktur, döngü başlığında bildiriminin yapılması yeterlidir. Bununla birlikte döngü indisi olan i değişkenine yalnızca
döngü içinde erişilebilir, döngünün dışında döngü indisine erişilemez. Örneğin döngü bittikten sonra i değişkeni çıktılanmak istendiğinde kod hata
verecektir. Aşağıda bu durum örneklenmiştir.
Döngü indisi olarak seçilen değişken döngüden önce tanımlanmış olsa dahi o değer kullanılmaz, döngü indisi döngü başlığında verilen başlangıç
değeriyle başlar. Aşağıda bu durum örneklenmiştir. i değişkeni döngüden önce tanımlanmış ve 100 değeri atanmıştır. Akabinde döngü başlığında
döngü indisi olarak da i değişkeni kullanılmıştır. Bu durumda i değişkeni döngü içinde kendisine atanan başlangıç değeri olan 1 değerini kullanır, daha
önce atanan 100 sayısı dikkate alınmaz. Bununla birlikte döngü bittikten sonra i değişkeni yazdırılmak istendiğinde yukarıdaki koddaki gibi hata
alınmaz, bunun yerine 100 değeri çıktılanır. Çünkü i değişkeni döngüden önce ayrıca tanımlandığı için döngü bitiminde de kendi orijinal değeriyle
erişilebilir. Aşağıda bu durum örneklenmiştir.
i değeri: 100
for döngüsü her zaman bir artmak zorunda değildir. for döngüsünün değişim miktarı her iterasyonda ikişer ikişer artacak, onar onar katlanacak, beşer
beşer bölünecek, üçer üçer azalacak vb. istenildiği gibi verilebilir. Bu durumda döngünün koşulu da değiştirilmelidir.
Aşağıdaki örnekte 150-50 arası beşer azalan sayıların toplamını ekrana çıktılayan Web sayfası ve JavaScript kodu verilmiştir. Döngü incelenirse
başlangıç değerine i = 150 verildiği görülecektir. Döngünün 150 ve 50 arası sayılarla çalışması istendiğinden döngü koşulu olarak i >= 50 verilmiş,
böylece döngü indisinin 50 değerinden büyük olduğu müddetçe döngünün çalışması sağlanmıştır. Döngünün beşer beşer azalması istendiğinden
değişim parametresi olarak i -= 5 verilmiştir.
for döngüsü başı ve sonu belli olan yani kaç kere tekrarlanacağı baştan belli olan döngü gerektiren durumlarda kullanılır. Buradan hareketle dizi
elemanlarının kaç tane olduğu bilindiğinden for döngüsü dizi elemanlarını döngü içinde işlemek (iterate etmek) için kullanılır. Aşağıdaki örnekte
bolumler isimli bir dizi tanımlanmıştır. Sonraki satırda bolumler dizisinin elemanları for döngüsü ile sayfaya çıktılanmıştır. Dizilerde ilk elemanın
indisi 0 olduğundan dizinin başlangıç değeri let i = 0; olarak verilmiştir. Dizinin ne kadar tekrar edeceğini kontrol etmek
için i<[Link] koşulu verilmiştir. Dizi elemanları sırayla işlenmek için artış miktarı olarak 1 verilmiştir.
Gerçek hayat problemlerinde döngüler ve koşul yapıları sıklıkla birlikte kullanılır. Örneğin 1-50 arası üçe bölünebilen sayıların kaç tane olduğunu
bulmak için döngü ve koşul yapısı kullanılmalıdır. 1-50 arası sayıları iterate etmek için döngü kullanılmalı, döngü içindeki her bir sayının üçe bölünüp
bölünmediğini kontrol etmek için de koşul yapısı kullanılmalıdır.
for döngüsünde koşul hem döngüye girerken hem de döngünün her iterasyonunda kontrol edilir. Eğer koşul en baştan sağlanmazsa döngü hiç
çalışmayacaktır. Örneğin aşağıdaki for döngüsünde döngü indisine başlangıç değeri olarak 10 atanmış, koşul olarak ise döngü indisinin 1’den küçük
olması verilmiştir. 10 sayısı 1’den küçük olmadığından döngü koşulu baştan sağlanmayacak ve döngü hiç çalışmayacaktır.
Döngünün kaç kere çalışacağının bilinmediği durumlarda while döngüsü kullanılır. while döngüsü koşula bağlı olarak çalışır. Koşul döngüye
başlarken ve her iterasyonda kontrol edilir. Koşul en başta sağlanmazsa döngüye hiç girilmez (Horstmann, 2020). Koşul sağlanıyorsa (sağlandığı
müddetçe) döngü çalışır. Döngünün bir noktada sonlanması için koşulun sağlanmaması (koşulun false olması) gerekir. while döngüsünün sözdizimi
aşağıda verilmiştir .
Örneğin 1’den itibaren ardışık sayıların toplamını bulmak isteyelim. Fakat toplam değer 1000’den büyük olduğunda döngü sonlansın. Bu problemde
döngünün başlangıç değeri bilinmektedir (1) fakat döngünün bitiş değeri yani hangi sayıdan itibaren toplamın 1000’den büyük olacağı
bilinmediğinden (döngünün kaç kere çalışacağı baştan bilinemediğinden) while döngüsü kullanılmalıdır. Bu problemin while döngüsü ile çözümü
aşağıda verilmiştir. Sayıların toplam değerini saklamak için toplam değişkeni tanımlanmış ve henüz toplamaya başlanmadığından 0 başlangıç değeri
atanmıştır. Döngü indisi olarak sayi değişkeni seçilmiş ve döngü 1’den başlayacağı için başlangıç değeri olarak 1 atanmıştır. while döngüsünde koşul
olarak toplam değerin 1000’den küçük veya eşit olduğu müddetçe çalışması istenmiştir. Bir diğer ifadeyle toplam değer 1000’den büyük olduğunda
döngüden çıkılacaktır. İlk durumda toplam değer 0 olduğundan ve koşul toplam <= 1000 olduğundan koşul sağlanmaktadır (0 < 1000) ve döngü
çalışmaya başlayacaktır. Döngünün her iterasyonunda toplam değeri o anki döngü indisi olan sayıyla toplanmış, o anki sayi ve toplam değerleri
ekrana çıktılanmış ve sayi değişkeni bir artırılmıştır.
Bu kod HTML sayfası içinde <body> etiketleri arasında kaydedilip çalıştırıldığında aşağıdaki çıktı alınacaktır. Çıktıdan da görüleceği üzere 1’den
itibaren ardışık sayılar toplanmış ve 45. sayıda toplam değer 1035 olduğunda koşul sağlanmayarak (1035 <= 1000) döngüden çıkılmıştır
Sayi: 1, Toplam: 1
Sayi: 2, Toplam: 3
Sayi: 3, Toplam: 6
while döngüsünde kimi zaman koşul yerine true değerine sahip bir değişken verilebilir. Yukarıdaki problem bu yöntemle aşağıdaki gibi de yazılabilir.
Kod incelediğinde boolean veri tipinde kosul isminde true değerine sahip bir değişken tanımlanmıştır. while döngüsüne koşul verilmemiş bunun
yerine kosul isimli değişkenin değeri verilmiştir. while döngüsü koşul sağlanmışsa (true ise) döngü çalışmaya başlayacaktır ve koşul sağlandığı
müddetçe (true olduğu müddetçe) döngü çalışacağından döngümüz çalışacaktır. Döngünün içinde toplam değer if koşul yapısıyla kontrol edilerek
1000’den büyük ise koşul değişkeninin değerine false atanmıştır. Bu durum gerçekleştiğinde döngü sonraki iterasyonda koşulu kontrol edecek ve
koşul sağlanmadığı için de döngü sonlanacaktır.
Bu JavaScript kodu problemde istenileni yerine getirecek ve önceki kodun çıktısının aynısını verecektir.
for ve while döngülerinde koşul en başta kontrol edilmekteydi. Bu durumda koşul en başta hiç sağlanmıyorsa döngü hiç çalışmayacaktır. Fakat kimi
zaman döngünün en az bir kere çalışması gereken durumlar olabilir. İşte do-while döngüsü bu durumlar için kullanılır (Ackermann, 2022). Bu sebeple
do-while döngüsünde koşul başta değil sonda verilir. Aşağıda verilen do-while sözdiziminden de görüleceği üzere do{ } arası döngü bloğunda kodlar
çalıştırılmakta ve akabinde while ile koşul kontrol edilmektedir. Eğer koşul sağlanıyorsa döngü tekrar çalıştırılacak, koşul sağlanmıyorsa döngünün
çalışması sonlandırılacaktır. Bu durumda döngü en az bir kere çalışmış olacaktır.
Örneğin kullanıcıdan bir sayı girmesini isteyelim. Kullanıcı tek sayı girerse kullanıcıdan sayı istemeye devam edilsin, çift sayı girdiğinde program
sonlansın. En sonda da girilen tüm sayıların toplamı çıktılansın. Bu problemde kullanıcının ne zaman çift sayı gireceğini bilemeyiz. Kullanıcı ilk
denemede de çift sayı girebilir, sonraki denemelerin birinde de çift sayı girebilir. Bu sebeple kullanacağımız döngü en az bir kere çalışmalıdır. İşte bu
gibi döngünün en az bir kere çalışması gereken durumlarda do-while döngüsü kullanılmalıdır. Aşağıda bu problemin do-while döngüsüyle çözümünü
içeren HTML sayfası ve JavaScript kodu verilmiştir. JavaScript kodu incelendiğinde kullanıcının girdiği sayıların toplamını tutacak toplam isimli bir
değişken tanımlanmış ve 0 başlangıç değeri atanmıştır. Kullanıcının girdiği sayıyı saklamak için sayi isimli değişken bildirilmiştir. Kullanıcı girdisini
almak için prompt komutu kullanılmıştır. prompt komutu “Bir sayı girin:” başlıklı bir mesaj ekranında kullanıcının sayı girmesini sağlamaktadır. Bu
problemde amaç do-while döngüsünü örneklemek olduğundan kodu öğrenci açısından daha karmaşık hale getirmemek için kullanıcının bu ekranda
sayı harici değerler girmediği varsayılmıştır.
Girilen sayı çift olmadığı için Web sayfası bizden tekrar sayı girmemizi isteyecektir. Gelen ekranda bu sefer 6 sayısını girelim.
Bu sefer çift sayı girildiğinden do-while döngü koşulu (6 % 2 == 1) sağlanmayacak ve döngüden çıkılacaktır. JavaScript kodu girilen 5 ve 6 sayılarını
toplamını ekrana çıktılayacaktır.
Toplam: 11
Bir diğer örnek olarak sayı tahmin oyunu yapalım. JavaScript koduyla 0-10 arası rastgele bir sayı üretelim ve kullanıcıdan 0-10 arası bir sayı girmesini
isteyelim. Eğer kullanıcı rastgele üretilen bu sayının aynısını girerse ekrana “Bildiniz” yazalım, bilemezse kullanıcıdan tekrar sayı girmesini isteyelim.
Bu durumda kullanıcıdan kaç kere sayı isteyeceğimizi bilemediğimizden bir döngü kullanmalıyız. Bu problem örneğinde kullanıcı ilk seferinde veya
sonraki tahminlerin birinde sayıyı doğru tahmin edebilir. Bu sebeple döngünün en az bir kere çalışması gerekecektir. Bu yüzden bu problemde do-
while döngüsü kullanılmalıdır.
Aşağıdaki JavaScript kodunun ilk satırında [Link]() * 11 ifadesiyle 0-10 arası rastgele bir sayı üretilmekte ve üretilen sayı [Link]()
metoduyla yuvarlanmaktadır. do-while döngüsünün içinde prompt metoduyla kullanıcıdan bir sayı girmesi istenmektedir. do-while döngüsüne koşul
olarak rastgele üretilen sayı ile kullanıcının girdiği sayının aynı olmama durumu verilmiştir. Böylece rastgele üretilen sayı ile kullanıcının girdiği sayı
aynı olduğunda döngü sonlanacaktır.
Diziler indis-değer, objectler ise anahtar-değer çiftlerinden oluşurlar. Dizi ve object türünde veri yapılarının anahtarlarını (dizilerin indisleri ve
objectlerin anahtarları) döngü içinde kullanmak (üzerinde işlem yapabilmek) için for..in döngüsü kullanılır (Flanagan, 2020; Svekis, Putten ve
Percival, 2021).
Örneğin aşağıda bolumler adında dizi tanımlanmıştır. Bu dizinin indislerini döndürmek için for..in döngüsü kullanılır. Diziye sadece elemanlar
atanmış fakat indisler verilmemiştir. JavaScript dilinde dizi indisleri sıfırdan başlamakta ve birer artmaktaydı. Bu durumda kod çalıştırıldığında
sıfırdan başlayarak dizi indislerini ekrana çıktılayacaktır.
for..in döngüsü object veri tipinde değişkenlerle (nesnelerle) birlikte kullanıldığında nesnelerin anahtarlarını işler. Aşağıda bununla ilgili örnek
verilmiştir. for..in döngüsünde bolumler adındaki nesnenin anahtarları konsola çıktılanmaktadır.
WTKO
BLPR
SSAO
Object veri tipindeki nesnelerin anahtarlarının yanı sıra değerleri de for..in döngüsüyle işlenebilir. Fakat bu durumda [indis] notasyonu kullanılmalı ve
dizinin indisi olarak döngü değişkeni verilmelidir. Aşağıdaki JavaScript kodunda bu durum örneklenmiş ve hemen altında kodun çıktısı paylaşılmıştır.
SSAO : Sosyoloji
Dizi ve object türünde veri yapılarının değerlerini (dizinin elemanlarını ve nesnelerin değerlerini) döngü içinde kullanmak (üzerinde işlem
yapabilmek) için for..of döngüsü kullanılır (Flanagan, 2020; Svekis ve diğerleri, 2021).
Bilgisayar Programcılığı
Sosyoloji
Çok boyutlu veri yapılarının her bir boyutundaki değerleri işlemek için iç içe döngüler kullanılır. Özellikle matris, JSON öğesi, tablo satırlarının
verisini işlemek için iç içe döngülerin kullanılması gerekmektedir.
Aşağıda verilen 5 satır 2 sütunlu matrisi ekrana çıktılamak için iç içe döngülerin kullanılması gerekmektedir.
Aşağıda bu çıktıyı veren Web sayfasının kodları verilmiştir. İç içe döngülerin ilki satırları işlemek için ikincisi ise sütunları işlemek için
kullanılacaktır. Her iki sütun arasında bir ilişki olup olmadığı incelendiğinde ikinci sütundaki değerlerin ilk sütundaki değerlerin bir fazlası olduğu
görülecektir.
4.3.1. break
Döngülerin koşul sağlandığı müddetçe tanımlı tüm iterasyonları sırayla ve eksiksiz çalıştıracağı ifade edilmişti. Fakat kimi zaman şartlar sağlanmışsa
döngünün çalışmasını sonlandırmak yani döngüden çıkmak gerekebilir. break komutu döngünün sonlanmasını sağlar (Flanagan, 2020; Svekis ve
diğerleri, 2021). break komutundan sonra kalan döngü iterasyonları çalıştırılmaz ve döngüden çıkılır.
Örneğin 1-100 arasındaki sayıların toplamını hesaplayalım. Döngünün her iterasyonunda o anki döngü indisi ve toplam değer sayfaya yazdırılsın.
Fakat toplam değer 250 veya üzeri olduğunda program sonlansın. Bu durumda toplam değeri her iterasyonda kontrol etmek gerekecektir. Toplam
değer 250 veya üzeri olmuşsa break komutuyla döngü sonlandırılmalıdır. Aşağıda bunu sağlayan Web sayfası ve JavaScript kodu verilmiştir. Toplam
değeri saklamak için toplam isminde bir değişken tanımlanmış 0 başlangıç değeri atanmıştır. Akabinde istenildiği üzere 1-100 arası sayıları
döndürmek için for döngüsü açılmıştır. Döngünün her iterasyonunda o anki döngü indisi ve toplam değeri sayfaya yazdırılmıştır. Toplam değerin 250
veya üzeri olduğunun kontrolü için if koşul yapısı kullanılmış ve koşul sağlanmışsa break komutuyla döngüden çıkılmıştır.
Web sayfası çıktısının baş tarafı ve son tarafı aşağıda verilmiştir. Görüldüğü üzere 22. sayıda toplam değer 253 olmuş ve döngüden çıkılmıştır.
Sayı: 1 , Toplam: 1
Sayı: 2 , Toplam: 3
Sayı: 3 , Toplam: 6
Bir başka örnek olarak 25-250 arası 7’ye bölünebilen 10 tane sayı sayfaya çıktılansın. Bu problemde yediye bölünebilen sayı adedini tutmak için bir
değişken kullanmak ve döngü içinde bu değişkenin değeri 10 olduğunda döngüyü break komutuyla sonlandırmak gerekmektedir. Aşağıdaki Web
sayfasında yer alan JavaScript kodunda bu problemin çözümü verilmiştir. Öncelikle 7’ye tam bölünebilen sayıların adedini tutmak için adet isimli bir
değişken tanımlanmış ve bu değişkene 0 başlangıç değeri atanmıştır. Ardından 25-250 arası sayıları döndürmek için for döngüsü kurulmuştur. Döngü
içinde o anki indis değerinin 7’ye tam bölündüğünün kontrolü if koşul yapısıyla kontrol edilmiştir. Bölünüyorsa adet değişkeninin değeri 1 artırılmış
ve bölünen sayı sayfaya çıktılanmıştır. Devamında adet değişkeninin değerinin 10 olup olmadığı başka bir if koşul yapısıyla kontrol edilmiştir. adet
değişkeninin değeri 10 olduğunda break komutuyla for döngüsünün sonlanması sağlanmıştır.
1. sayı: 28
2. sayı: 35
3. sayı: 42
4. sayı: 49
5. sayı: 56
6. sayı: 63
7. sayı: 70
8. sayı: 77
9. sayı: 84
10. sayı: 91
4.3.2. continue
Kimi zaman bazı döngü indislerinde döngünün çalışmaması istenebilir. Bu durumda döngü o iterasyonda çalışmayıp pas geçer ve bir sonraki
iterasyonla devam eder. continue anahtar kelimesi bu işlevi yerine getirmek için kullanılır (Flanagan, 2020; Svekis ve diğerleri, 2021).
Örneğin 1-100 arası sayıları ekrana çıktılamak isteyelim fakat bu sayıların içinde 7’ye tam bölünenler ekrana çıktılanmasın. Bu durumda her döngü
iterasyonunda o anki döngü indisi kontrol edilmelidir. Eğer döngü indisi 7’ye tam bölünmüyorsa ekrana çıktılanmalı, bölünüyorsa pas geçilip bir
sonraki döngü iterasyonuyla döngü çalışmaya devam etmelidir. Aşağıda bu problemin çözümü için 1-100 arası sayıları döndürmek amacıyla for
döngüsü kurulmuştur. Döngü içinde o anki döngü indisinin 7’ye tam bölündüğü if koşul yapısıyla kontrol edilmiştir. Eğer tam bölünüyorsa döngünün
kalan komutları çalıştırmaması ve sıradaki döngü indisiyle çalışmaya devam etmesi için continue döngü kontrol komut verilmiştir. Eğer tam bölünme
yoksa bu durumda o anki döngü indisi sayfaya çıktılanmıştır.
Kaç kere tekrar edeceği belli döngüler için for döngüsü kullanılır. Kaç kere çalışacağı belli olmayan durumlarda while döngüsü kullanılır. Koşullar
sağlanmazsa for ve while döngüleri en baştan da çalışmayabilir. Koşula bağlı çalışması gereken fakat en az bir kere çalışması gereken durumda ise
do-while döngüsü kullanılır.
Veri yapılarını kolayca döngü içinde işlemek için for..in ve for..of döngüleri kullanılır. for..in döngüsü veri yapısının anahtarlarını, for..of döngüsü ise
indislerini işler.
Döngünün bütün iterasyonlarının çalışmasını beklemeden istenilen anda döngüden çıkmak için break anahtar kelimesi kullanılır. Bir koşul
gerçekleştiğinde döngünün o anki iterasyonunda bir şey yapmadan sıradaki indis değeriyle çalışmasını sağlamak için continue anahtar kelimesi
kullanılır.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
Horstmann, C. (2020). Modern JavaScript for the Impatient (1st edition.). Boston Columbus New York San Francisco Amsterdam Cape Town:
Addison-Wesley Professional.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
(B) while döngüsü, bir koşul sağlandığı sürece döngünün çalışmasını sağlar.
(C) do-while döngüsü, döngü içeriğini en az bir kez çalıştırdıktan sonra koşulu kontrol eder.
(D) break komutu, döngüyü sonlandırmak için kullanılır ve döngüden çıkışı sağlar.
(E) continue ifadesi, döngüyü sonlandırmak için kullanılır ve döngüyü baştan başlatır.
Cevap-1 :
Soru-2 :
(Çoktan Seçmeli)
(B) 0'dan başlayarak 4'e kadar (5 hariç) olan sayıları konsola yazdırır.
Cevap-2 :
Soru-3 :
(C) Döngü, sonsuz döngüye girer ve ekrana sürekli kullanıcının girdiği sayı yazdırılır.
Eğer kullanıcı geçersiz bir giriş yaparsa, uyarı mesajı konsola yazdırılır.
Cevap-3 :
Döngü, sonsuz döngüye girer ve ekrana sürekli kullanıcının girdiği sayı yazdırılır.
Soru-4 :
(Çoktan Seçmeli)
Cevap-4 :
Soru-5 :
Tanımlanan bir obj nesnesinin değerleri for..in döngüsüyle konsol ekranına çıktılayan JavaScript kodu hangi seçenekte doğru verilmiştir?
(Çoktan Seçmeli)
(B)
Soru-6 :
Aşağıdaki kodlar çalıştırıldığında dizi elemanlarının konsola sırayla yazdırılabilmesi için … ile boş bırakılan yer aşağıdaki seçeneklerden hangisi ile
tamamlanmalıdır?
(Çoktan Seçmeli)
Cevap-6 :
Soru-7 :
Yukarıdaki ekran görüntüsünün elde edilebilmesi için aşağıda verilen kod satırlarındaki … ile boş bırakılan yer aşağıdaki seçeneklerden hangisi ile
(Çoktan Seçmeli)
(A) continue;
(B) break;
(C) next;
(D) else;
then;
Cevap-7 :
continue;
Soru-8 :
Yukarıdaki ekran görüntüsünün elde edilebilmesi için do-while koşulu nasıl tamamlanamaz?
(Çoktan Seçmeli)
Cevap-8 :
sayi < 3
Soru-9 :
(Çoktan Seçmeli)
(B) Döngünün kaç kere çalışacağının bilinmediği durumlarda while döngüsü kullanılır.
(D) Dizi ve object türünde veri yapılarının anahtarlarını döngü içinde kullanmak için for..of döngüsü kullanılır.
Cevap-9 :
Dizi ve object türünde veri yapılarının anahtarlarını döngü içinde kullanmak için for..of döngüsü kullanılır.
Soru-10 :
(Çoktan Seçmeli)
(A)
Cevap-10 :
Özlü Söz
“Sadelik karmaşıklığın en üst noktasıdır.”
– Leonardo da Vinci
Kazanımlar
1. Dizi kavramını ve dizilerin genel özelliklerini bilir.
Birlikte Düşünelim
1. Bir değişkende birden fazla veri saklamanın yolu var mıdır?
2. Diziler hem nümerik hem de string veri tipinde veri saklayabilir mi?
4. Diziden bir eleman silindiğinde o elemanın tamamen mi silinir yoksa yeri kalır ve sadece içeriği mi silinir?
6. Dizilere elemanlar sırayla mı eklenir yoksa dizi elemanları arasında boşluk olabilir mi?
7. Dizi elemanlarını kolayca işlemek için özel döngü türleri var mıdır?
11. Diziler nasıl karşılaştırılır? İki dizinin aynı olduğunu nasıl ispatlarsınız?
Başlamadan Önce
Diziler, birden fazla değerin tek bir yapı altında saklanmasını sağlayan önemli bir dil yapısı ve veri türüdür. Dizi elemanlarına indis numarasıyla
Diziler esnek yapıdadır, saklayacağı eleman sayısının baştan belirtilmesine gerek yoktur. Diziler oluşturulduktan sonra eleman eklenebilir, silinebilir
ve dizi elemanları değiştirilebilir. Dolayısıyla diziler dinamik yapıdadır.
Dizi elemanları döngü içinde kolaylıkla işlenebilir. for döngüsüne ilave olarak diziler için özel tasarlanmış forEach döngüsü, dizi elemanlarını işlemek
için for..of döngüsü ve dizi indislerini işlemek için for..in döngüsü kullanılır.
Bir dizi elemanı başka bir dizi olursa dizi içinde dizi yapısı meydana gelir. JavaScript dilinde matris, tablo gibi yapıları kullanmak için çok boyutlu
dizi oluşturulabilir.
JavaScript dilinde dizileri ve dizi elemanlarını işlemek için çok sayıda yerleşik metod bulunmaktadır. Diziler değişkenler üzerinden değil elemanları
üzerinden karşılaştırılır.
Bu bölümde JavaScript dilinde diziler, dizi tanımlama, dizi elemanlarını manipüle etme, dizi metodları konuları ele alınmaktadır.
5.1. Diziler
Dizi (array), aynı veya farklı veri türünde birden fazla veri öğesini saklayan mantıksal veri yapısıdır (Ackermann, 2022; Flanagan, 2020; Svekis,
Putten ve Percival, 2021).
JavaScript dilinde yerleşik basit veri tipleri bellekte en fazla tek bir veri saklayabilirken, diziler çok sayıda veri saklamak için tasarlanmışlardır.
Örneğin bir fakültedeki bölümlerin isimlerini saklamak için her bir bölüme bir tane değişken oluşturmak gerekmektedir.
Bu durum bölüm sayısı arttıkça kod yönetilemez bir hal alacaktır. Bu türde bir yol takip edildiğinde hangi değişkende hangi elemanın tutulduğu ve
toplamda kaç adet bölüm oluşturulduğu bilinemez. Diziler ise çok sayıda veriyi tek bir değişken altında saklayabilirler. Yukarıda örneklenen durum
dizi kullanılarak çok daha pratik bir şekilde çözülebilir.
Tarayıcıda “Geliştirici araçları” menüsü tıklandığında konsol sekmesine yukarıdaki kod satırları yapıştırıldığında aşağıdaki ekran gözükecektir.
Diziler aynı veya farklı türde elemanları (element) saklayabilir. Elemanların dizide bulunduğu konuma indis (index) denir. JavaScript dizilerinde ilk
elemanın indis numarası sıfırdır. Sonraki elemanların indis numarası sırasıyla birer artar. Örneğin bolumler dizisinin ilk elemanı olan "Web Tasarımı
JavaScript dilinde diziler dinamiktir yani dizilere daha sonradan eleman eklenebilir ve diziden eleman silinebilir. Bu sebeple dizinin eleman sayısının
baştan verilmesi zorunlu değildir. Dizi elemanları benzersiz (eşsiz) olmak zorunda değildir yani dizide mükerrer elemanlar olabilir (bir eleman dizide
birden fazla kere bulunabilir).
Diziler esasında object veri türündedir. typeof anahtar kelimesiyle bir dizinin veri tipi elde edilmek istendiğinde object döndürecektir. Yukarıda
tanımlanan bolumler dizisinin veri tipi aşağıdaki kod satırıyla konsol ekranına çıktılanmıştır.
Dizinin eleman sayısı length dizi özelliğiyle elde edilir. Aşağıda bolumler dizisinin kaç elemanlı olduğunu konsol ekranına çıktılanmıştır.
[Link]([Link]); // 3
Aşağıda örneklenen dersler dizisi String veri tipinde elemanları saklamakta, sonuclar dizisi ise Number veri tipinde elemanları saklamaktadır.
Dizi elemanları farklı veri tiplerinde de olabilir. Aşağıda verilen örnekte karisikVeri isimli dizi tam sayı, ondalıklı sayı, dizge, boolean, undefined,
fonksiyon ve object veri tipinde elemanlara sahiptir.
Dizi oluşturmanın bir diğer yöntemi ise new Array() kurucu metodunu kullanmaktır. Aşağıdaki örnekte new Array() kurucu metoduyla dizi
oluşturulmuştur.
Dizi oluşturulurken kaç eleman saklayacağı new Array(eleman_sayisi) sözdizimiyle başlangıçta ayarlanabilir. Bu durumda verilen eleman sayısı kadar
yer ayrılmış boş bir dizi oluşturulur. Böyle tanımlanan dizinin eleman sayısı daha sonra istenildiği kadar genişletilebilir.
Aşağıda verilen örnekte isimler adında 10 elemanlı boş bir dizi oluşturulmuştur. İkinci satırda boş dizinin tamamı ve sonraki satırda ise dizinin ilk
elemanı konsola çıktılanmıştır.
Bu yöntemle dizinin eleman sayısı belirtilmesine rağmen dizi başta verilen bu sayının üzerinde de eleman saklayabilir. Örneğin aşağıdaki satırda
dizinin 13. elemanına Ahmet değeri atanmaktadır. Bu kod satırı hata vermeyecek ve sorunsuz çalışacaktır.
Her iki dizi oluşturma yöntemini kullanarak boş bir dizi oluşturmak için parantezler içinde elemanlar veya eleman sayısı verilmez.
Diziler de tıpkı değişkenler gibi let, var ve const anahtar kelimeleriyle tanımlanabilir. const (sabit) ile oluşturulan bir dizi daha sonra tekrar
tanımlanamaz (dizi değişkenine doğrudan değer atanamaz) fakat dizinin elemanları köşeli parantez notasyonuyla veya dizi metodlarıyla değiştirilebilir,
silinebilir ve diziye yeni eleman eklenebilir. Aşağıda bunu örneklemek için sayilar isminde sabit bir dizi tanımlanmış (const ile) ve bu diziye 5 eleman
atanmıştır. Alt satırda ise sayilar dizisi atama operatörü ile yeniden tanımlanmak istenmiştir. Bu durumda ikinci satır hata verecektir ve
çalışmayacaktır.
const ile oluşturulan diziler bu şekilde tekrar tanımlanamaz fakat elemanları değiştirilebilir, diziye daha sonra eleman eklenebilir veya dizi elemanları
silinebilir. Yukarıda oluşturulan sayilar dizisinin elemanları, köşeli parantez notasyonu ve dizi metodlarıyla manipüle edilmiştir.
Bir dizi değişkeni başka bir dizi değişkenine atama operatörüyle kopyalanabilir. Aşağıdaki örnekte ilk satırda sayilar isimli ve 5 elemanlı bir dizi
oluşturulmuş ve ikinci satırda sayilar2 isimli değişkene sayilar değişkenin değeri atanmış yani sayilar dizisi sayilar2 isimli başka bir değişkene
kopyalanmıştır. Sonraki satırda sayilar2 isimli dizi konsola çıktılanmıştır.
Atama operatörüyle bir dizi değişkeni başka bir değişkene kopyalandığında, kopyalanan dizi elemanı değiştirilirse orijinal dizi elemanı da değişir veya
orijinal dizinin bir elemanı değiştirildiğinde kopyalanan dizinin de elemanı değişir.
Aşağıda verilen ilk kod satırında sayilar2 dizisinin ilk elemanının değeri 34 olarak değiştirilmektedir. Bundan sonraki satırlarda sayilar2 ve sayilar
dizilerinin ilk elemanları konsola çıktılanmıştır. Çıktılar görüntülendiğinde her iki dizinin ilk elemanının 34 olduğu yani orijinal dizinin ilk elemanının
da değiştiği görülecektir.
Yayılma operatörüyle bir dizi kopyalandığında ve daha sonra kopyalanan dizinin elemanlarında bir değişiklik yapıldığında orijinal dizide bir değişiklik
olmaz. Aşağıda bu durum örneklenmiştir. Son iki satırda verilen konsol çıktılarından da görüleceği üzere yayılma operatörüyle kopyalanan dizide
(sayilar2) ilk elemanın değerinin değiştirilmesi orijinal diziyi etkilememiştir.
Dizi metodları kullanılarak da diziye yeni eleman eklenebilir. unshift() metodu dizinin en başına yeni eleman eklerken, push() metodu dizinin sonuna
yeni eleman ekler. Aşağıda her iki metodun kullanımı örneklenmiştir.
JavaScript dilinde dizi elemanlarının indisleri sıralı olmak zorunda değildir yani dizi elemanlarının indisleri arasında boşluk olabilir (seyrek). Aşağıda
tek elemanlı sayilar dizisi tanımlanmış ve sonraki satırda bu dizinin dördüncü elemanına -6 değeri atanmıştır. Konsol çıktısından da görüleceği üzere
dizi elemanları arasında iki tane boşluk oluşmuştur. Bu durumda aradaki elemanların değeri undefined olacaktır.
Diziden bir elemanın değerini silmek için delete operatörü de kullanılabilir. delete operatörü silinecek elemanın kendisini değil indisi parametre olarak
alır. Parametre olarak verilen indisteki elemanın yerine undefined yazılır yani diziden eleman tamamen silinmez, elemanın dizideki yeri korunur fakat
içeriği boşaltılır. Bu yüzden delete operatörü kullanıldığında dizinin eleman sayısı değişmez.
Aşağıda meyveler isimli bir dizi tanımlanmış ve dizinin elemanları döngü türleriyle konsola çıktılanmıştır. JavaScript dilinde dizi indisleri sıfırdan
başladığı için aşağıdaki for döngüsünde başlangıç değeri 0 verilmiştir. Dizinin eleman sayısı length özelliğiyle edinildiğinden döngü sayacının dizinin
eleman sayısından küçük olması for döngüsüne çalışma koşulu olarak verilmiştir. Döngü içinde ise o anki sayaç değeri ne ise döngünün o indisteki
elemanına erişilmiş (meyveler[i]) ve [Link] metoduyla o anki dizi elemanı konsola çıktılanmıştır.
Dizi sınıfının forEach metodu dizi elemanlarını döngü içinde işlemek için tasarlanmıştır . forEach metodu dizinin her bir elemanı için bir fonksiyon
çağırır ve onu çalıştırır. İstisna olarak undefined olan dizi elemanları için bu fonksiyon çalıştırılmaz. Aşağıdaki forEach metoduyla meyveler dizisinin
elemanları konsola çıktılanmıştır.
İndislerde sayı yerine dizge kullanmanın olumsuz yönleri bulunmaktadır. Örneğin bu dizinin eleman sayısı length özelliğiyle öğrenilmek istendiğinde
geriye 0 dönecektir.
Bu kodun konsol çıktısı aşağıda verilmiştir. Görüleceği üzere dizi elemanları tek boyutlu (tek satırda) değil iki satırda listelenmiştir.
Çok boyutlu dizilerde dizi elemanının kendisi de dizidir. Yukarıda verilen matris dizisinin her satırı bir dizidir. Bu dizi aşağıdaki gibi de tanımlanabilir.
yenimatris dizisi iki elemanlıdır. Dizinin birinci elemanı ciftSayi dizisi iken ikinci elemanı tekSayi dizisidir. Dizinin ilk elemanı olan ciftSayi dizisinin
5, aynı şekilde tekSayi dizisinin de 5 elemanı bulunmaktadır.
İç içe dizilerin elemanlarını işlemek için her bir boyut için bir döngü kullanmak gerekir. yenimatris dizisi matris formunda olduğundan (satır ve sütun)
iki boyutludur ve bu dizinin bütün elemanlarını işlemek amacıyla aşağıdaki örnekte iç içe iki for döngüsü kullanılmıştır.
Verilen avaScript kodunda matris formundaki dizinin her satırı web sayfasında ayrı bir satırda çıktılanmış ve sütun elemanlarından sonra çıktının daha
okunaklı olması için – sembolü eklenmiştir. Web sayfasının görüntüsü aşağıda verilmiştir.
0-2-4-6-8-
at(indis)
Aşağıda verilen örnekte bolumler dizisinin ilk elemanı ve tekSayilar dizisinin dördüncü elemanı konsola çıktılanmıştır.
concat(değer1, … değerN)
concat() metodu iki diziyi birleştirir ve birleştirilmiş yeni diziyi geri döner, orijinal diziyi değiştirmez.
Aşağıda verilen örnekte ciftSayilar dizisinin sonuna concat() metoduyla tekSayilar dizisi eklenmiş ve yeni dizi sayilar değişkenine atanmıştır.
Akabinde sayilar dizisi konsola çıktılanmıştır.
copyWithin() metodu dizinin bir bölümünü aynı dizi içinde başlangıç ve bitiş indisleri verilen yeni bir konuma kopyalar. Böylece dizinin elemanları
değiştirilir fakat dizinin uzunluğu değiştirilmez.
Aşağıda verilen [Link](3, 0, 4) örneğinde metodun parametrelerine bakacak olursak hedef = 3, başlangıç indisi = 0 ve bitiş indisi = 4
olmaktadır. Başlangıç indisi = 0 ve bitiş indisi = 4 arasındaki dizi elemanları [1, 2, 3, 4] alınır. Hedef = 3 verildiği için bu elemanlar üçüncü indisten
itibaren aynı dizinin üzerine yazılır. Bu durumda dizi [1, 2, 3, 1, 2, 3, 4, , ] olacaktır. Kalan kısım, orijinal dizinin sonundaki elemanlarla doldurulacak
ve nihai dizi [1, 2, 3, 1, 2, 3, 4, 8, 9] olacaktır.
Aşağıda verilen [Link](1, 4) örneğinde hedef = 1, başlangıç indisi = 4 olmaktadır. Bitiş indisi ise verilmemiştir. Bu durumda başlangıç
indisi 4 olan yerden (yani 5 değerinden) başlayarak dizinin sonuna kadar olan bölüm [5, 6, 7, 8, 9] kopyalanır ve hedef indisi 1 olan yerden itibaren
yapıştırılır. Bu durumda ilk elemanın değeri (indis 0) değişmeyecektir. [1, 5, 6, 7, 8, 9, ...]. Kalan kısım, orijinal dizinin sonundaki elemanlarla
doldurulacak ve nihai dizi [1, 5, 6, 7, 8, 9, 7, 8, 9] olacaktır.
entries()
Bir dizinin her bir elemanı için [anahtar, değer] formatında döndürülebilir dizi nesnesi oluşturur. Anahtar olarak elemanın indisini, değer olarak da
elemanın değerini kullanır.
Aşağıda verilen örnekte bolumler dizisine entries() metodu uygulanmış ve [anahtar, değer] formatında döndürülebilir dizi nesnesi konsola
çıktılanmıştır.
every(KullaniciTanimliFonksiyon)
every() metodu dizideki her bir elemana parametre olarak aldığı yerleşik fonksiyonu veya kullanıcı tanımlı fonksiyonu uygular. Dizinin tüm
elemanları verilen fonksiyondaki şartları sağlıyorsa metod true döner, dizinin tek bir elemanı dahi fonksiyondaki şartı sağlamıyorsa metod false döner.
Örneğin aşağıda bir sayının tek sayı olduğunu test eden tekMi isimli fonksiyon tanımlanmıştır. ciftSayilar ve tekSayilar dizilerinin her bir elemanına
every metodu kullanılarak tekMi isimli fonksiyon uygulanmıştır. Dizi elemanlarının hepsi tek sayı ise sonuç true olacaktır, tek bir tanesi bile false
dönerse sonuç false olacaktır.
Konsol çıktısından da görüleceği üzere every() metodu ciftSayilar dizisine uygulandığında false dönmüş, tekSayilar dizisine uygulandığında true
dönmüştür. sayilar dizisinde ise hem tek hem de çift sayılar bulunduğundan tekMi fonksiyonunun şartını sağlamamış ve every() metodu false
dönmüştür.
fill() metodu bir dizinin elemanlarını verilen değer ile değiştirir. fill() metodu eğer başlangıç parametresi almışsa bu durumda o indisten itibaren dizi
elemanını değiştirir; bitiş parametresi almışsa o indise kadar elemanları değiştirir; başlangıç ve bitiş parametresi almamışsa dizinin tüm elemanlarının
yerine verilen değeri yazar. fill() metodu geriye değiştirilmiş diziyi döner.
Aşağıdaki örnekte fill() metoduyla sonuclar dizisinin tüm elemanlarının değeri 8 ile değiştirilmiştir.
Aşağıdaki örnekte fill() metodu tekSayilar dizisinin ikinci indisinden itibaren tüm elemanlarını 8 değeri ile değiştirmektedir.
Aşağıdaki örnekte fill() metodu ciftSayilar dizisinin sıfırıncı indisinden itibaren üçüncü indise kadar (üçüncü indis dahil değildir) tüm elemanlarını 8
değeri ile değiştirmektedir.
filter(KullaniciTanimliFonksiyon)
filter() metodu dizi elemanlarının her birine parametre olarak aldığı yerleşik fonksiyonu veya kullanıcı tanımlı fonksiyonu uygular ve bu fonksiyonun
şartlarını sağlayan dizi elemanlarını geri döndürür.
Aşağıdaki örnekte filter() metodu sonuclar dizisine kucuktur25 fonksiyonunu uygulamakta ve dizide değeri 25’ten küçük elemanları filtrelemektedir.
findLast(KullaniciTanimliFonksiyon)
find() metodu dizi elemanlarını verilen yerleşik fonksiyon veya kullanıcı tanımlı fonksiyon içinde arar. Verilen fonksiyon içinde aranan değerle eşleşen
ilk elemanı geri döndürür. Aranılan değer dizide yoksa undefined döner.
Aşağıdaki örnekte sayilar dizisinde -4 değeri aranmıştır. Dizide iki tane -4 değeri bulunmaktadır fakat find() metodu ilk bulduğu değeri döner.
findIndex(KullaniciTanimliFonksiyon)
findLastIndex(KullaniciTanimliFonksiyon)
findIndex() fonksiyonu dizide bir elemanı doğrudan aramaz bunun yerine diziye kullanıcı tanımlı fonksiyonu uygular ve fonksiyonun şartını sağlayan
ilk indis geri döndürülür. Hiçbir eleman bu şartı sağlamıyorsa -1 döner.
Aşağıdaki örnekte sayilar dizisinde -4 değerinin ilk bulunduğu indis findIndex() metoduyla aranmıştır. Dizide iki tane -4 değeri bulunmaktadır fakat
findIndex() metodu aranılan değerin dizide ilk bulunduğu indisi döner.
flat(derinlik)
flat() metodu iç içe dizinin elemanlarıyla birleştirilmiş yeni bir dizi oluşturur yani dizileri düzleştirir. Metod parametre olarak derinlik değeri alır.
Derinlik parametresinin varsayılan değeri 1 alınır. Derinlik parametresine Infinity değeri verilirse dizinin derinliğine bakılmaksızın bütün derinlikteki
diziler düzleştirir.
Aşağıdaki örnekte [2, 3] alt dizidir ve bu dizi elemanlarının derinliği 1’dir; [4 ile başlayan dizinin derinliği de 1’dir; [5 ile başlayan dizinin derinliği
2’dir; [6] dizisinin derinliği 3’tür. Örneğin [Link](2) ifadesi ikinci dereceden dizileri dizi olmaktan çıkarır ve normal eleman yapar.
flatMap(KullaniciTanimliFonksiyon)
flatmap() metodu dizinin her bir elemanına parametre olarak aldığı kullanıcı tanımlı fonksiyonu uygular ve geriye değiştirilmiş diziyi döndürür.
Aşağıda verilen flatMap() metoduyla ciftSayilar dizisindeki elemanların yarı değeri alınmıştır.
forEach(KullaniciTanimliFonksiyon)
Aşağıdaki örnekte sayilar dizisindeki pozitif sayıların toplamı forEach() metodu içinde verilen ok fonksiyonu yardımıyla hesaplanmış ve daha sonra
konsolda toplam değer çıktılanmıştır.
from(deger, KullaniciTanimliFonksiyon)
from() metodu aldığı parametre içindeki veriyi kullanarak bir dizi oluşturur.
Aşağıdaki örnekte from()metoduna parametre olarak verilen kelimenin harflerinden bir dizi oluşturulmuştur.
Aşağıdaki örnekte ciftSayilar dizisindeki elemanların yarı değerleriyle yeni bir dizi oluşturulmuş ve konsola çıktılanmıştır.
includes(deger)
includes() metodu dizi elemanları içinde belirli bir değerin olup olmadığını kontrol eder. Eğer aranılan değer dizide varsa true, yoksa false döner.
Aşağıdaki ilk örnekte sayilar dizisinde -123 değerinin olup olmadığı, ikinci örnekte ise kemirgen dizisinde kunduz değerinin olup olmadığı includes()
metoduyla kontrol edilmiş ve sonuç konsola çıktılanmıştır.
lastIndexOf(deger)
indexOf() metodu dizi içinde parametre olarak aldığı elemanı arar ve aranan eleman dizide varsa elemanın bulunduğu konumu (indisi) döndürür,
aranan eleman dizide yoksa -1 döner. lastIndexOf() metodu ise aranan elemanın dizide bulunduğu son konumu döner, bulamazsa -1 döner.
Aşağıdaki örnekte sayilar dizisinde -4 elemanı indexOf() ve lastIndexOf() metodlarıyla aranmıştır. -4 değeri sayilar dizisinde iki yerde geçmektedir.
indexOf() metodu -4 değerinin dizideki ilk bulunduğu indisi yani 0, lastIndexOf() metodu ise -4 değerinin sayilar dizisinde son bulunduğu yerin
indisini yani 2 döndürmüştür.
Aşağıdaki kodda ise kemirgen dizisinde kunduz değeri aranmıştır. Dizide böyle bir eleman yer almadığından hem indexOf() hem de lastIndexOf()
metodları -1 döndürmüştür.
isArray(deger)
isArray() metodu bir değişkenin veya değerin dizi olup olmadığını kontrol eder. Eğer kontrol edilen değer bir dizi ise true, değilse false döner.
Aşağıdaki örneklerde isArray() metoduna dizi olan ve olmayan değerler verilerek sonuçlar konsol ekranına çıktılanmıştır.
join(ayraç)
join() metodu dizi elemanlarının arasına parametre olarak aldığı ayracı kullanarak bir dizge oluşturur. join() metodu diziyi değiştirmez. Ayraç
parametresine bir değer verilmezse varsayılan olarak virgül , kullanılır.
Aşağıdaki örnekte sayilar dizisinin anahtarları keys() metoduyla ile elde edilmiş ve for döngüsünün içinde ekrana çıktılanmıştır.
keys() metodu isimli dizilerin anahtarlarını vermez. Aşağıda bununla ilgili bir örnek verilmiştir.
Bu kod hata vermez fakat aynı zamanda ekrana herhangi bir çıktı da vermeyecektir.
map(KullaniciTanimliFonksiyon)
map() metodu dizi elemanlarının her birine parametre olarak aldığı fonksiyonu uygular ve neticesinde yeni bir dizi döndürür.
Aşağıdaki örnekte map() metodu içinde yariDeger isimli kullanıcı tanımlı fonksiyon çağrılarak ciftSayilar dizisinin her biri elemanının yarısı alınmış
ve dönen değerlerle yeni bir dizi oluşturulmuştur.
of() metodu parametre olarak aldığı değerlerden yeni bir dizi oluşturur.
Aşağıdaki örnekte kemirgen isimli dizi of() metoduyla oluşturulmuş ve konsola çıktılanmıştır.
of() metoduna parametre verilmezse boş bir dizi oluşturur. Aşağıdaki örnekte of metoduna parametre verilmemiş ve oluşan boş dizi abc isimli
değişkene atanmıştır. İkinci satırda bu değişkenin dizi olup olmadığı isArray() metoduyla sorgulanmış ve dönen değer konsola çıktılanmıştır.
pop()
pop() metodu dizinin son elemanını siler ve sildiği elemanı geri döner.
Aşağıdaki örnekte ciftSayilar dizisini son elemanı pop() metoduyla silinmiş ve silinen değer konsola çıktılanmıştır.
push()
push() metodu dizinin sonuna yeni eleman ekler ve dizinin yeni durumdaki eleman sayısını geri döner.
Aşağıdaki örnekte kemirgen dizisine push() metoduyla yeni eleman eklenmiş ve dizinin eleman sayısı konsola çıktılanmıştır. Son satırda dizinin
reduce(KullaniciTanimliFonksiyon, baslangicDeger)
reduceRight(KullaniciTanimliFonksiyon, baslangicDeger)
reduce() metodu dizi elemanlarının her birine (soldan sağa doğru) verilen kullanıcı tanımlı fonksiyonu uygular ve sonucu geri döndürür. reduce()
metodu dizide bir değişiklik yapmaz. Kullanıcı tanımlı fonksiyonun yapısı ise aşağıdaki gibi olmalıdır.
Kullanıcı tanımlı fonksiyona biriktirici parametresinin verilmesi zorunludur. Bu parametre her bir dizi elemanıyla yapılan işlem sonucunun tutulduğu
değişkendir. mevcutDeger parametresi de aynı şekilde zorunludur. mevcutDeger parametresi dizide o an işlenen elemanın değerini ifade eder.
mevcutIndis ve dizi parametrelerinin verilmesi isteğe bağlıdır.
Aşağıda verilen örnekte bir dizideki pozitif sayıların toplamı reduce() metoduyla elde edilmiştir. reduce() metodu pozitiflerinToplami isimli
fonksiyonu çağırmaktadır. pozitiflerinToplami fonksiyonu parametre olarak toplam isimli değişken ve o anki dizi elemanının değerini almaktadır. Bu
fonksiyonun gövdesinde dizi elemanının değerinin sıfırdan büyük olma durumu kontrol edilmektedir. Elemanın değeri sıfırdan büyükse toplam
değerine ilave edilmektedir, değilse toplam değer değişmemektedir. Nihai toplam değeri konsol ekranına çıktılanmaktadır.
reduce() metodu dizi elemanlarını soldan sağa doğru işler. Bunu ispatlamak için aşağıda verilen tekSayilar dizisinin elemanlarından yan yana
bütünleşik bir dizge (string) değer oluşturulmuştur. Konsol çıktısından da görüleceği üzere dizi elemanları soldan sağa işlenerek birleştirilmiştir.
reduce() metodunun benzeri olan reduceRight() metodu ise dizi elemanlarını sağdan sola doğru işler. Bunu örneklemek için yukarıda verilen kod
örneği bu sefer reduceRight() metoduyla çalıştırılmıştır. Kodun çıktısından da görüleceği üzere dizi elemanları bu sefer sağdan sola doğru
birleştirilmiştir.
toReversed()
reverse() metodu dizi elemanlarının sırasını ters yöne çevirir yani diziyi tersine çevirir ve ters sıralanmış diziyi döndürür. reverse() metodu tersine
sıralanan diziyi orijinal dizinin üzerine yazar yani diziyi değiştirir. Orijinal diziyi değiştirmeden dizi elemanlarını tersine çevirmek için toReversed()
metodu kullanılır.
shift()
shift() metodu dizinin ilk elemanını siler, diziyi değiştirir ve dizinin eleman sayısı bir azalır. shift() metodu geriye silinen elemanı döndürür.
slice() metodu aldığı başlangıç ve bitiş parametrelerine göre dizinin istenilen bölümünün kopyasını döndürür. slice() metodu dizide bir değişiklik
yapmaz.
some(KullaniciTanimliFonksiyon)
some() metodu dizi elemanlarının her birine parametre olarak verilen kullanıcı tanımlı fonksiyonu uygular. Eğer dizi elemanlarından en az biri verilen
fonksiyondaki koşulu sağlıyorsa true döner, hiçbiri sağlamıyorsa false döner. some() metodu dizide bir değişiklik yapmaz. some() metodunda çağrılan
fonksiyon dizide değer almamış (undefined) elemanlara uygulanmaz.
toSorted()
sort() metodu dizi elemanlarını sıralar ve sıralanmış diziyi döndürür. Dizi elemanları önce dizgeye dönüştürülür ve ardından varsayılan olarak artan
sıralama yapar. Örneğin 3 ve 27 elemanlarını sıralarken elemanları önce “3” ve “27” şeklinde dizgeye dönüştürür ve ardından baş harflere veya
sayılara bakar. 2 sayısı 3’ten önce geldiği için “27”, “3” şeklinde sıralama yapar. sort() metodu sıralanan diziyi orijinal dizinin üzerine yazar yani diziyi
değiştirir. Orijinal diziyi değiştirmeden dizi elemanlarını sıralamak için toSorted() metodu kullanılmalıdır.
splice() metodu dizi elemanlarının değerini değiştirmek, araya eleman eklemek veya dizi elemanlarını silmek için kullanılır. splice() metodu geriye
değiştirilmiş yeni diziyi döner. Orijinal diziyi koruyarak farklı bir dizi döndürmek için toSpliced() metodu kullanılmalıdır.
splice() metodunda sadece indis parametresine değer verilip diğer parametrelere değer verilmezse bu durumda indis parametresinden sonraki dizi
elemanları silinecektir. Aşağıdaki örnekte ciftSayilar dizisinde ikinci indisten itibaren tüm dizi elemanları silinecektir.
splice() metodunda indis parametresine ilave olarak silinecekElemanSayisi parametresine de değer verilirse bu durumda belirtilen indisten itibaren
silinecekElemanSayisi kadar eleman silinecektir. Aşağıdaki örnekte tekSayilar dizisinin ikinci indisinden itibaren 2 elemanın silinmesi istenmiştir. Bu
durumda 5 ve 7 elemanları silinecektir.
splice() metodunda indis parametresine negatif değer verildiğinde işlemler dizinin başından değil sonundan itibaren yapılacaktır. Aşağıdaki örnekte
ciftsayilar dizisinin sondan ikinci indisinden itibaren bir elemanın silinmesi istenmiştir. Dizi indisleri baştan sayılırken sıfırdan başlar fakat sondan
sayılırken birden başlar. Bu durumda en sonuncu elemanın indisi -1, bir solundaki -2 olarak sayılır. Böylece aşağıdaki kullanımda -2. indisdeki 6
silinecektir.
toString()
toString() metodu dizi elemanlarını aralarına virgül koyarak string veri tipinde döndürür yani dizgeleştirir. Aşağıda verilen iki örnekte önce nümerik
veri saklayan ciftSayilar dizisi ve daha sonra string veri saklayan kemirgen dizisi toString() metoduyla elemanlarının arasına virgül konularak
dizgeleştirilmiş ve konsola çıktılanmıştır.
unshift()
unshift() metodu dizinin en başına eleman ekler, orijinal diziyi değiştirir ve dizinin yeni durumdaki eleman sayısını geri döner.
Aşağıdaki örnekte 5 elemanlı ciftSayilar dizisinin başına -2 ve -4 elemanları eklenmiş ve son durumdaki dizinin elaman sayısı olan 7 ekrana
çıktılanmıştır. Sonraki satırda ise ciftSayilar dizisi toString() metoduyla dizgeleştirilmiş ve konsola çıktılanmıştır.
Aşağıdaki örnekte kemirgen dizisinin başına kunduz elemanı eklenmiş ve üçüncü satırda kemirgen dizisinin elemanları toString() metoduyla
dizgeleştirilmiş ve konsola çıktılanmıştır.
Aşağıdaki kodun ikinci satırında valueOf() metodunun kullanımıyla üçüncü satırda dizi değişkenini başka bir değişkene atayan kod eşdeğerdir.
values()
Aşağıdaki örnekte tekSayilar dizisinin elemanları values() metoduyla alınmış ve for döngüsünde ekrana çıktılanmıştır.
with(indis, değer)
with() metodu dizideki belirli bir indisin değerini değiştirmek için kullanılır. with() metodu orijinal diziyi değiştirmez.
Aşağıda verilen kodun ikinci satırında kemirgen dizisinin ilk indisindeki elemanın değeri [Link](1, "kunduz") ifadesiyle kunduz olarak
değiştirilmiş ve yeni oluşan dizi kemirgen2 değişkenine atanmıştır. Üçüncü satırda kemirgen2 dizisi konsola çıktılanmıştır. with() metodunun orijinal
dizide bir değişiklik yapmadığının ispatı olarak kemirgen dizisi son satırda konsola çıktılanmıştır.
JavaScript dilinde diziler esasında object veri tipindedirler. object veri tipinde oluşturulan değişkenler belleğin farklı alanlarında saklanırlar. Bu
sebeple iki dizi değişkeni aynı sayıda elemana sahip olsalar ve elemanlarının değerleri aynı olsa dahi farklı bellek alanlarında saklandığı için == veya
=== operatörleriyle karşılaştırıldığında false dönecektir. Bu sebeple dizilerin eşit olup olmadığı değişkenler üzerinden değil dizi elemanları tek tek
kıyaslanarak yapılmalıdır.
Aşağıdaki örnekte aynı sayıda ve aynı elemanlarda olan iki dizinin == ve === operatörleriyle eşit olduğu kontrol edilmiştir. Bu diziler aynı olduğu
halde false değeri çıktılanmıştır.
Dizilerin eşitliğini kontrol etmek için dizi elemanları string veri tipine çevrilerek çok daha pratik bir şekilde yapılabilir. Bunun için toString()veya
[Link]() metodlarıyla kullanılabilir. Aşağıda toString()metoduyla iki dizinin eşitliği kontrol edilmektedir.
Dizi bildirimi köşeli parantez notasyonu [] ile yapılır. new Array() kurucu metoduyla da dizi oluşturulabilir.
Dizilerin eleman sayısı dinamiktir. Dizi oluşturulduktan sonra diziye eleman eklenebilir ve silinebilir. unshift() metoduyla dizinin en başına, push()
metoduyla dizinin sonuna yeni eleman eklenir. Dizinin ilk elamanını silmek için shift() metodu, son elamanını silmek için pop() metodu, diziden çok
sayıda eleman silmek için splice() metodu kullanılır. Dizi elemanlarına erişim yine köşeli parantez notasyonuyla [indis] şeklinde erişilmek istenen
indis değeri verilerek yapılır.
Döngüler dizi elemanlarını işlemek için sıklıkla kullanılır. Klasik for döngüsünün yanı sıra diziyi kolayca işlemek için tasarlanmış forEach döngüsü
sıklıkla kullanılır. Dizi elemanlarını döngü içinde işlemek için for..of döngüsü kullanılırken, dizi anahtarlarını döngü içinde işlemek için for..in
döngüleri kullanılır.
Dizi içinde dizi oluşturmak mümkündür. Bir dizinin herhangi bir elemanı başka bir dizi olabilir. Böylece iç içe diziler oluşturulabilir. Ayrıca diziler iki
veya daha çok boyutlu tasarlanabilir.
Diziler object türünde olduklarından dizi değişkenleri belleğin farklı adreslerinde saklanır. Bu sebeple dizi değişkenleri eşitlik kontrolü yapan
operatörlerle karşılaştırıldığında diziler aynı olsa bile false döner. Bunun yerine dizi elemanları tek tek karşılaştırılmalı veya toString() veya
[Link]() gibi metodlar kullanılabilir.
Diziler programlama için önemli ve çok kullanılan dil yapıları arasında olduğundan her dilde olduğu gibi JavaScript dilinde de dizilerle ilgili çok
sayıda yerleşik metod tanımlanmıştır. Böylece programcı dizileri veya dizi elemanlarını işlerken kendi metodlarını yazmaya gerek duymaksızın bu
metodları kullanabilir.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
Horstmann, C. (2020). Modern JavaScript for the Impatient (1st edition.). Boston Columbus New York San Francisco Amsterdam Cape Town:
Addison-Wesley Professional.
Scott, A., MacDonald, M. ve Powers, S. (2021). JavaScript Cookbook: Programming the Web (3rd edition.). Beijing Boston Farnham Sebastopol
Tokyo: O’Reilly Media.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
(A) 0
(B) 1
(C) 2
(D) 3
Cevap-1 :
Soru-2 :
(Çoktan Seçmeli)
Cevap-2 :
Soru-3 :
Dizinin elemanını silen ancak dizinin uzunluğunu değiştirmeyen operatör veya metod aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
remove komutu
Cevap-3 :
delete operatörü
Soru-4 :
letdizi= [3,12,8,"deneme",-4,"JS"];
(Çoktan Seçmeli)
(A) dizi[[Link] - 1]
(B) dizi[[Link]]
(C) dizi[6]
(D) dizi[[Link]]
dizi[[Link]-1]
Cevap-4 :
dizi[[Link] - 1]
Soru-5 :
Aşağıda verilen dizinin beşinci elemanının değerini “test” olarak değiştiren komut hangi seçenekte verilmiştir?
letdizi= [3,12,8,"deneme",-4,"JS"];
(Çoktan Seçmeli)
Cevap-5 :
dizi[4] = "test";
Soru-6 :
[Link]([Link](3));
(Çoktan Seçmeli)
(A) 0
(B) 1
(C) 3
(D) 4
Cevap-6 :
Soru-7 :
(Çoktan Seçmeli)
Cevap-7 :
Soru-8 :
(Çoktan Seçmeli)
Cevap-8 :
Soru-9 :
Dizilerin indislerini (anahtarlarını) döngü içinde işlemek için özel olarak geliştirilmiş döngü çeşidi aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
do-while döngüsü
Cevap-9 :
for..in döngüsü
Soru-10 :
İki diziyi birleştiren ve birleştirilmiş yeni diziyi geri dönen metod aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
(A) join()
(B) concat()
(C) copyWithin()
(D) merge()
add()
Cevap-10 :
concat()
Özlü Söz
“Programlama, program yazarak öğrenilir.”
– Brian Kernighan
Kazanımlar
Kazanımlar
6. Ok fonksiyonu tanımlayabilir.
Birlikte Düşünelim
1. Fonksiyonların işlevi nedir?
11. Fonksiyonlar kendiliğinden çalışır mı? Kendiliğinden çalışan fonksiyon tanımlanabilir mi?
14. Sınıflar kod içinde doğrudan sınıf ismiyle çağrılıp kullanılabilir mi?
Başlamadan Önce
Fonksiyonlar, bir işlevi olan isimli kod bloklarıdır. Kod içinde bir işlevin farklı yerlerde çalıştırılması gerektiğinde her seferinde o işlevi tekrar yazmak
yerine fonksiyon adı verilen isimli bir yapı altında o işlev tanımlanır ve sadece ismiyle ve gerekiyorsa argümanlarla o fonksiyon çağrılır. Böylece daha
az kodla aynı iş yerine getirilmiş olur. Fonksiyonlar sayesinde kod tekrarı olmaz, kodun okunurluğu artar, kodun bakımı kolaylaşır ve bakım maliyeti
düşer.
Bu bölümde JavaScript dilinde parametreli parametresiz, varsayılan değerde parametreli, geriye değer döndüren, döndürmeyen fonksiyonlar örnekle
açıklanmıştır. Fonksiyon türleri, isimsiz fonksiyonlar, ok fonksiyonları, üreteç fonksiyonla ve fonksiyon-değişken ilişkileri, fonksiyonların kapsamı
konuları örneklerle işlenmiştir.
Bölümün devamında sınıf kavramı ve JavaScript dilinde sınıf tanımlama, çağırma ve sınıflarda miras alma konusuna yer verilmiştir.
Birlikte Düşünelim
Başlamadan Önce
6.1. Fonksiyon
JavaScript dili fonksiyonel bir dildir bu sebeple fonksiyonlar JavaScript açısından önemli programlama yapıları arasındadır. Fonksiyonlar, kod
içerisinde bir görevi veya işlevi yerine getirmek için tasarlanan isimli kod yapısıdır (Scott, MacDonald ve Powers, 2021). Fonksiyonların bir ismi
vardır ve bu sayede ismiyle çağrılır ve çalıştırılırlar. Bir işi yerine getiren kod satırlarını kaynak kod içerisinde tekrar tekrar yazmaktansa ilgili kodlar
bir isimle fonksiyon yapısı altında tanımlanır ve gerektiği durumlarda bu fonksiyon çağrılır. Bu açıdan fonksiyonlar kodun yeniden kullanımını sağlar,
böylece kodun satır sayısı ve karmaşıklığı azalır ve buna bağlı olarak da kodun bakım maliyeti azalır ve kodun okunurluğu artar. Ayrıca fonksiyonlar
başka projelerde de yeniden kullanılabilir. Böylece fonksiyonlar sayesinde kodun taşınabilirliği artar.
Fonksiyonlar bir işlevi yerine getirirler. Aynı işlevdeki tekrarlanan kod satırlarını her seferinde yazmaktansa fonksiyonlar geliştirici açısından kullanım
kolaylığı sağlarlar. Örneğin aşağıda üç ürünün fiyatı ve iki farklı KDV oranı verilmiştir. İstenen şey ise birinci ve üçüncü ürünün %18 KDV oranıyla
hesaplanması ve ikinci ürünün %25 KDV oranıyla hesaplanarak toplam KDVli fiyatların sayfaya çıktılanmasıdır.
Bu sayfadaki JavaScript kodunda her bir ürünün KDV hesabının aynı formülle tekrar tekrar yapıldığı görülecektir. Halbuki bu KDV hesabı bir
fonksiyon olarak tanımlanabilir ve her gerektiği yerde bu fonksiyon çağrılabilir. Bu amaçla bu sayfadaki ürünlerin KDVli fiyatının hesaplanması için
dışarıdan ürünün fiyatını ve KDV oranını alan ve çağrıldığı yere ürünün KDVli fiyatını hesaplayıp döndüren kdvHesapla isimli fonksiyon aşağıda
verilmiştir.
Fonksiyonlar tanımlandığında otomatik olarak çalışmaz, yalnızca çağrıldığı zaman çalışır. Fonksiyonlar parametreler sayesinde dışarıdan veri alır,
böylece daha esnek kullanıma sahip yazılımlar geliştirilebilir. Programlamada fonksiyonların kullanışlı olmasını sağlayan bir başka özellik de return
anahtar kelimesiyle fonksiyonların çalıştıktan sonra geriye değer döndürmesidir.
Fonksiyonlar bir sınıfın içinde tanımlanabilir. Bu durumda sınıf metodu olarak isimlendirilir. Bu kullanım sınıf kavramı altında ele alınacaktır.
Fonksiyonlar nesnedir ve buna bağlı olarak bir değişkene değer olarak fonksiyon atanabilir. JavaScript dilinde bir fonksiyonun içinde bir başka
fonksiyon yani iç içe fonksiyon tanımlanabilir. Bu durumda fonksiyonlar tanımlandıkları kapsamdaki tüm değişkenlere erişebilirler (Flanagan, 2020).
Fonksiyonlar parametre alabilir, geriye değer döndürebilir. Bir fonksiyon bir değişkene değer olarak atanabilir, başka bir fonksiyona argüman olarak
verilebilir ve başka bir fonksiyonun dönüş değeri olabilir (Horstmann, 2020).
Bir fonksiyon function anahtar kelimesi, fonksiyon başlığı (isim ve parametre) ve fonksiyon gövdesinden oluşur (Horstmann, 2020). JavaScript dilinde
basit bir fonksiyonun tanımlama sözdizimi aşağıdaki gibidir (Ackermann, 2022).
Fonksiyon başlığında function anahtar kelimesinden sonra fonksiyona bir isim verilir. Bölüm 2’de ele alınan Tanıtıcı isimlendirme kuralları
fonksiyonlara verilen isimlerde de geçerlidir. Süslü parantezlerden sonra fonksiyonun gövdesi yer alır. Fonksiyonun gövdesinde çalışması gereken kod
satır(lar)ı yer alır.
Aşağıda, işlevi konsola Sistem aciliyor... çıktısını vermekten ibaret basit bir fonksiyon örneği verilmiştir.
Fonksiyonlar otomatik olarak çalışmazlar yalnızca çağrıldığında çalışırlar. Fonksiyonlar ismiyle ve varsa parametrelerine değer verilerek çağrılırlar.
Fonksiyonlar çağrılırken parametrelere verilen değerlere argüman denir (Svekis ve diğerleri, 2021). Yukarıda örneklenen AcilisMesaji isimli
fonksiyonun çalışması için aşağıdaki gibi çağrılması gerekir.
AcilisMesaji();
Fonksiyonların kimi zaman gövdesindeki kodları çalıştırdıktan sonra elde edilen bir değeri veya değişkeni çağrıldığı yere döndürmesi istenebilir. Eğer
fonksiyonun geriye değer döndürmesi isteniyorsa fonksiyon gövdesinin en son satırında return anahtar kelimesiyle birlikte döndürülmesi istenen değer
veya değişken verilir (Ackermann, 2022). return anahtar kelimesi geriye değer döndürmek için kullanılır. return anahtar kelimesinden sonra
fonksiyonun çalışması sonlanır. Aşağıda hem parametre alan hem de geriye değer döndüren fonksiyonun sözdizimi verilmiştir.
Fonksiyonlar genelde dışarıdan veri alır, fonksiyon gövdesinde bu veriyi işler ve gerekirse çağrıldığı yere bunu döndürürler. Böylece kodun esnekliği
artırılmış olur. Fonksiyonların dışarıdan veri alması için parametre(ler) kullanılır. Bir fonksiyon bir veya daha fazla sayıda parametre alabilir.
Aralarında virgül kullanılarak fonksiyonlara birden fazla parametre verilebilir (Svekis ve diğerleri, 2021). Fonksiyonların parametre alması zorunlu
değildir. Parametre alan fonksiyonun sözdizimi aşağıda verilmiştir.
Parametre alan fonksiyonlar ismi ve aldığı parametrelere argümanların verilmesiyle çağrılır. Argümanlar doğrudan bir değer olabileceği gibi değişken
hatta başka bir fonksiyon da olabilir. Yukarıda örneklenen sayilariTopla isimli fonksiyonun çağrılması aşağıda örneklenmiştir.
Yukarıda örneklenen kdvHesapla fonksiyonunda kullanıcı fonksiyonu çağırırken KDV değeri vermediğinde bu ürünün KDV değeri 18 olarak
kullanılacaktır. Aşağıdaki kod incelendiğinde urun1 ve urun3’ün KDVli fiyatları hesaplanırken KDV oranları verilmemiştir. Bu durumda urun1 ve
urun3’ün KDV oranı 18 olarak ayarlanacaktır. urun2 içinse KV oranı olarak kdv2 değişkeni yani 25 değeri verilmiştir
Bir fonksiyonun alacağı parametrelerin sayısı bilinmiyorsa veya kullanıma göre parametre sayısı değişiyorsa bu durumda rest parametresiyle (... üç
nokta operatörüyle) fonksiyona istenilen sayıda parametre verilebilir (Svekis ve diğerleri, 2021). Bu kullanımın sözdizimi aşağıda verilmiştir.
Örneğin bir dizideki negatif sayıların küplerinin toplamını çıktılayan fonksiyonu üç noktalı rest parametresiyle çözebiliriz. Fonksiyonun alacağı
argüman sayısı belirtilmediğinden istenilen sayıda argüman verilebilir demektir ve bu sebeple bu kullanım daha uygun olacaktır. Aşağıda bunu
sağlayan JavaScript kodu verilmiştir.
Kodun çıktısından da görüleceği üzere fonksiyon iki kere çağrılmış ve ikisinde de fonksiyona farklı sayıda argüman verilmiştir.
Anonim fonksiyonlar ismi olmayan fonksiyonlardır (Flanagan, 2020). Anonim fonksiyonlar genellikle başka bir fonksiyona parametre olarak
verilirler, olay işleyici olarak kullanılırlar veya bir değişkene değer atanarak kullanılır. Anonim fonksiyonların ismi olmadığı için çağrılamaz ve bu
nedenle yalnızca bir kere çalıştırılırlar. Bu sebeple anonim fonksiyonlara daha sonra erişilemez. Fakat anonim fonksiyonlar bir değişkene değer olarak
atanırlarsa bu değişken daha sonra kullanılabilir. Anonim fonksiyonların sözdizimi aşağıda verilmiştir.
Diziler konusunda örneklenen bir dizi içerisinde pozitif sayıları bulma problemini filter metoduyla çözelim. filter metodunun içinde görüleceği üzere
isimsiz anonim fonksiyon verilmiştir. Anonim fonksiyon parametre olarak bir sayı almış ve bu sayı sıfırdan büyükse daha önce boş olarak oluşturulan
pozitifSayilar isimli diziye eklenmiştir.
11.03.2024 17:05:46
Anonim fonksiyonlar başka bir fonksiyona argüman olarak verilebilir. Yukarıda örneklenen kendini çalıştıran anonim fonksiyonun her saniye tekrar
çalışması için setInterval fonksiyonu kullanılabilir. setInterval fonksiyonu bir kodu veya fonksiyonu belirli bir zaman aralığı süresince tekrarlı kere
çalıştırmak için kullanılır. saat_tarih elementinde güncel saniye verisini çıktılamak için setInterval fonksiyonuna yukarıda örneklenen anonim
fonksiyon ve 1000 ms değeri argüman olarak verilmiştir. Bu sayede 1000 milisaniyede bir kez yani saniyede bir kez bu anonim fonksiyon
çalıştırılacak ve böylelikle güncel saat, dakika ve saniye verisi sayfada ilgili elemente çıktılanacaktır.
Anonim fonksiyonların bir ismi olmadığından daha sonra çağrılamayacağı ve sadece bir kere çalıştırılacağı ifade edilmişti. Eğer anonim fonksiyon bir
değişkene değer olarak atanırsa daha sonra bu değişkene her erişildiğinde anonim fonksiyon tekrar tekrar çalıştırılabilir. Bu kullanıma fonksiyon
ifadesi (function expression) denir (Flanagan, 2020). Fonksiyon ifadeleri programcıya hızlıca kodlama yapma imkânı sağlar. Fonksiyon ifadesinin söz
dizimi aşağıda verilmiştir.
Fonksiyon ifadesinin çağrılması aşağıda verilmiştir. Görüleceği üzere ilk fonksiyon ifadesi sıradan bir değişken çağırır gibi kullanılmış, ikinci
fonksiyon ifadesi ise parametre aldığı için degisken2(parametreler) sözdizimiyle çağrılmıştır.
Aşağıda verilen tekSayilariBul isimli bir başka fonksiyon ifadesi ise kendisine argüman olarak verilen bir dizideki tek sayıları bulmakta ve geri
döndürmektedir.
ECMAScript 6 (ES6) ile fonksiyon ifadesi tanımlamanın daha sade, kısa ve okunabilir bir hali olan ok fonksiyonları (arrow functions) dile
kazandırılmıştır (Flanagan, 2020). Ok fonksiyonunun gövdesinde tek satır yer alıyorsa return anahtar kelimesi kullanılmasa da kod satırındaki ifadenin
değeri geri döndürülür. Ok fonksiyonunun gövdesinde birden fazla satır yer alacaksa bu kod satırları süslü parantezler arasında verilir ve geri dönecek
değer return anahtar kelimesiyle belirtilir. Ok fonksiyonunun sözdizimi aşağıda verilmiştir.
Bir önceki konu olan fonksiyon ifadesinde örneklenen büyük sayıyı bulan fonksiyon ifadesi örneği ok fonksiyonu ile daha az satırda kod ile daha
okunaklı bir şekilde aşağıdaki gibi yazılabilir.
JavaScript dilinde iç içe fonksiyon tanımlamak mümkündür (Ackermann, 2022). Bu durumda içerde tanımlanan fonksiyon dış kapsamdaki
değişkenlere erişebilir. İç fonksiyona yalnıza tanımlandığı dış fonksiyon erişebilir, dış fonksiyonun dışında bir yerden iç fonksiyona erişilemez. İç içe
fonksiyon tanımlama sözdizimi aşağıda verilmiştir.
Koddan da görüleceği üzere son iki satırda uzunlukOlc isimli dış fonksiyon çağrılmış ve karşılaştırması için iki sayı verilmiştir. Kod akışına
bakıldığında mutlakDegerHesapla isimli fonksiyonda sayının mutlak değeri geri dönmüş ve devamındaki karsilastir isimli fonksiyonda mutlak değeri
alınan iki sayıdan sayı doğrusu üzerinde sıfıra daha uzak olan yani boyca büyük olan sayı geri döndürülmüştür. Bu kodda iç fonksiyonlar yalnızca dış
fonksiyonun içinden erişilebilir. Örneğin dış fonksiyonun dışında mutlakDegerHesapla isimli fonksiyona erişilemez. Aşağıdaki satır bu sebeple hata
verecektir.
Geleneksel bir fonksiyon hiçbir değer döndürmeyebilir veya sadece tek bir değer döndürebilirken üretici fonksiyonlar çok sayıda değer döndürebilir.
Üretici fonksiyon kullanmak için function anahtar kelimesinden sonra * sembolü ve fonksiyonun içinde dönen değeri belirtmek için yield anahtar
kelimesi kullanılır (Ackermann, 2022). return anahtar kelimesi fonksiyonun çağrıldığı yere bir değer döndürdükten sonra fonksiyonun çalışmasını
sonlandırmaktaydı. Fakat üretici fonksiyonun birden fazla değer döndürmesi için yield anahtar kelimesi kullanılır ve böylece fonksiyon değeri
döndürdükten sonra çalışmasını durdurur (Scott, MacDonald ve Powers, 2021). Üretici fonksiyonun tekrar çalışması ve sıradaki veriyi döndürmesi
için next() metodu kullanılır. value özelliğiyle sıradaki elemanın değeri elde edilir. Üretici fonksiyon tanımlama sözdizimi aşağıda verilmiştir.
Bir fonksiyonun içinde bir değişken let, var, const ifadeleri kullanılmadan tanımlandığında bu değişken global değişken olur ve kodun her yerinden bu
değişkene erişilebilir (w3schools, 2024).
Aşağıda deneme isimli bir fonksiyon çağrılmış, sonraki satırda x isimli değişken konsola çıktılanmıştır. Akabinde deneme isimli fonksiyon
tanımlanmıştır. Görüleceği üzere x isimli değişken tanımlanmadan önce çağrılmış ve üstelik bu değişken bir fonksiyonun içinden çağrılmasına rağmen
sorunsuz çalışmıştır. Çünkü x değişkeni tanımlanırken let, var, const kullanılmadığı için global değişkendir. Bu örnekte dikkat edilmesi gereken bir
diğer nokta ise deneme isimli fonksiyon ilk satırda çağrılmış fakat bu fonksiyonun tanımı çağrılmadan önce değil çağrıldığı satırdan sonra (üçüncü
satırda) tanımlanmıştır. Yani bir fonksiyon çağrısı fonksiyon tanımından önce de yapılabilir.
Bir fonksiyonun içinde global tanımlanan bir değişkenle aynı isimde lokal değişken tanımladığında ve fonksiyon çağrıldığında lokal değişken dikkate
alınacaktır. Aşağıda bu durum örneklenmiştir. x isimli ve 5 değerinde bir global değişken tanımlanmış ve aynı zamanda deneme fonksiyonu içinde de
x isminde lokal bir değişken tanımlanmıştır. Daha sonraki satırda deneme fonksiyonu konsola çıktılanmıştır. Konsolda global x değişkeninin değeri
olan 5 sayısı değil lokal x değişkeninin değeri olan 10 sayısı çıktılanacaktır.
Sınıf tanımı class anahtar kelimesiyle yapılır. Programcı tarafından tanımlanan her yapıda olduğu gibi sınıflara da bir isim verilir. Sınıf içinde
tanımlanan fonksiyonlara metod denir. Metod tanımlarken function anahtar kelimesi kullanılmaz. Sınıf yapısında veri saklamak için sınıf değişkenleri
kullanılmaktadır.
Tıpkı fonksiyonlar gibi sınıflar da tanımlandığında kendiliğinden çalışmaz. Bir sınıf tanımlandığında o sınıfı kullanabilmek için bir örneğini
oluşturmak gerekir. Sınıf örneği new anahtar kelimesiyle oluşturulur. Aşağıda sınıf örneği oluşturma sözdizimi verilmiştir.
new anahtar kelimesiyle oluşturulan sınıfın örneği bir değişkene atanır. Böylece o sınıfın metodlarına artık bu değişken üzerinden erişilir.
Aşağıda Satis isminde bir sınıf tanımlanmış ve sınıfın içinde kdvHesapla metodu verilmiştir. Bu metod fiyat ve kdv isminde iki parametre almıştır.
Metodun gövdesinde bu parametrelere verilen argümanlar kullanılarak KDV hesabı yapılmış ve hesaplanan değer metodun çağrıldığı yere return
anahtar kelimesiyle döndürülmüştür. Sonraki satırda Satis sınıfının bir örneği new anahtar kelimesiyle oluşturulmuş ve urunFiyati isimli değişkene
atanmıştır. Son satırda ise fiyatı 450, KDV oranı 18 olan bir ürünün fiyatı [Link](450, 18) ifadesiyle hesaplanmış ve [Link]
metoduyla sayfaya çıktılanmıştır.
Aşağıda verilen KupHesapla isimli sınıfta kare ve kup isimli iki metod yer almaktadır. kup metodu aynı sınıfta yer alan kare metoduna [Link](x)
ifadesiyle erişmiştir.
new KupHesapla() ifadesiyle KupHesapla sınıfının bir örneği oluşturulmuş ve kod içerisinde bu örneği kullanabilmek için hesap isimli değişkene
atanmıştır. Sonraki satırda KupHesapla sınıfının kup metodu, sınıf örneğinin atandığı hesap değişkeni üzerinden [Link](5) ifadesiyle çalıştırılmış
ve 5 sayısının küpü [Link]() metoduyla sayfaya çıktılanmıştır.
Sınıf örnekleri object veri türündedir. Yukarıdaki örnekte KupHesapla sınıfının bir örneği hesap isimli değişkende saklanmaktadır. typeof anahtar
kelimesiyle bu örneğin object veri tipinde olduğu aşağıdaki kod satırıyla konsol ekranına çıktılanmıştır.
Fonksiyonların çağrılması için fonksiyonun daha önce tanımlanmasına gerek yoktur. Yani bir fonksiyon çağrıldıktan sonra tanımlanabilir. Fakat bir
sınıfın örneğinin oluşturulması için önce sınıfın tanımlanması ve daha sonra sınıf örneğinin oluşturulması gerekir. Aşağıda bu durum örneklenmiştir.
Verilen kodun ilk satırında KupHesapla sınıfının bir örneği oluşturulmuş fakat KupHesapla sınıfı daha sonra tanımlandığı ve bu sebeple kod hata
verdiği için kodun devamı çalışmayacaktır.
Bir sınıfın örneği oluşturulduğunda kimi zaman bazı kodların otomatik olarak çalıştırılması gerekir. Sınıf sözdiziminde de verilen constructor()
fonksiyonu (kurucu/yapıcı metod) bu işlevi yerine getirir (Flanagan, 2020; Svekis, Putten ve Percival, 2021). Bir sınıf oluşturulduğunda otomatik
olarak çalıştırılması istenen kodlar constructor() metodunun içinde verilir. Kurucu metodda genelde sınıf değişkenlerine ilk değer atamaları yapılır.
Kurucu metod tıpkı diğer fonksiyonlar gibi parametre alabilir. Örneğin kurucu metod iki parametre almışsa bu sınıfın örneği new Sinif() sözdizimiyle
değil new Sinif(arguman1, arguman2) ifadesiyle oluşturulur.
Aşağıda verilen Satis sınıfında bir constructor (kurucu) metod ve kdvHesapla adında metod yer almaktadır. Kurucu metodun fiyat ve kdv isminde iki
parametresi bulunmaktadır. Kurucu metod dışarıdan aldığı fiyat ve kdv değerlerini sınıf değişkenlerine atamaktadır. Sınıf değişkenleri yapı itibariyle
global değişken gibi düşünülebilir. Böylece bu sınıf değişkenleri sınıftaki tüm metodlar tarafından erişilebilir olmaktadır. Kodun devamında verilen
kdvHesapla metodu this anahtar kelimesiyle artık sınıf değişkenleri olan fiyat ve kdv değişkenlerine erişmekte ve KDV hesabı yapmakta ve
hesaplanan değeri return anahtar kelimesiyle döndürmektedir. Sonraki satırda new anahtar kelimesiyle Satis sınıfının bir örneği oluşturulmuş ve urun
değişkenine atanmıştır. Fakat burada dikkat edilirse sınıf örneği new Satis() olarak değil new Satis(450, 18) ile yani iki argüman alarak
oluşturulmuştur. Satis sınıfında kurucu metod iki parametre aldığı için ve sınıfın bir örneği oluşturulduğunda bu kurucu metod otomatik çalıştırıldığı
için sınıf yalın halde değil iki argüman verilerek oluşturulmuştur. Sonraki satırda sınıfın kdvHesapla() metoduna urun değişkeni üzerinden erişilmiş ve
fiyatı 450, KDV oranı 18 olan bir ürünün KDVli fiyatı hesaplanarak geri dönmüş ve [Link]() metoduyla hesaplanan fiyat sayfaya
çıktılanmıştır.
Miras alma nesneye yönelik programlamanın önemli kavramlarından biridir. Kimi zaman bir sınıfa yeni metod eklemek mümkün olmayabilir veya
izinli olmayabilir. Bu durumda bu sınıf kopyalanır ve kopyalanan sınıfa yeni metod ve davranışlar eklenir. Bu ise kodların tekrarına ve karmaşaya
Bazen çocuk sınıf, ebeveyn sınıfın bazı metodlarını kullanmak istemeyebilir. Bu durumda çocuk sınıf içinde aynı isimde metod tanımlanır ve böylece
ebeveyn sınıfın o metodunu geçersiz kılınmış olur. Buna metod geçersiz kılma/ezme (method overriding) denir.
JavaScript diline miras alma ES6 (ECMAScript 2015) ile birlikte gelmiştir. Bir sınıfın metodları başka bir sınıfa extends anahtar kelimesi ile aktarılır
(miras alınır). JavaScript miras alma sözdizimi aşağıda verilmiştir.
JavaScript miras alma konusu daha önce verilen Satis sınıfı üzerinden örneklenebilir. Aşağıda verilen örnekte Depo sınıfı extends anahtar kelimesiyle
Satis sınıfını miras almıştır. Depo sınıfı içinde Giris isimli bir metod tanımlanmıştır. Giris metodunda KDVsi hesaplanan ürünün fiyatına depo maliyeti
olarak ilave 25 eklenmiştir. Burada dikkat edilirse Depo sınıfından ebeveyn sınıf olan Satis sınıfının kdvHesapla metodu super anahtar kelimesiyle
[Link]() ifadesiyle çağrılmıştır. Daha önceki örnekte Satis sınıfıyla 531 olarak hesaplanan ürünün fiyatına Depo sınıfıyla 25 eklenmiş ve
sayfada 556 çıktılanmıştır.
Fonksiyonların bir ismi olmalıdır fakat JavaScript dilinde isimsiz fonksiyonlar da tanımlanabilir. Bunlara anonim fonksiyonlar denir. Anonim
fonksiyonlar, genellikle diğer fonksiyonlarda argüman olarak kullanılır veya değişkenlere atanır. Bir değişkene atanan anonim fonksiyona fonksiyon
ifadesi denir. Anonim fonksiyonun ismi olmadığı için yalnızca bir kere çalışır fakat fonksiyon ifadeleri bir değişkene atandığı için değişken her
kullanıldığında fonksiyon ifadesi tekrar çalıştırılır.
JavaScript dilinde fonksiyonlar, ok fonksiyonları olarak bilinen daha kısa ve daha okunabilir bir sözdizimi ile de tanımlanabilir.
JavaScript dilinde bir fonksiyon içinde başka bir fonksiyon tanımlanabilir. İç fonksiyon dış fonksiyonun değişkenlerine erişebilir.
Fonksiyonlar return anahtar kelimesiyle çağrıldığı yere değer döndürebilir. Fakat fonksiyonlar birden fazla değer döndüremez. Üretici fonksiyonlar ise
her çağrılmada bir diziden veya herhangi bir veri yapısından sırayla değer döndürür. Üretici fonksiyonlar tanımlanırken * sembolü tanımlanır. Üretici
fonksiyonun değer döndürmesi için return yerine yield anahtar kelimesi kullanılır.
Sınıf yapısı, birbirleriyle ilişkili metodları bir çatı altında tutan ve yönetimini kolaylaştıran dil yapısıdır. Bir sınıfta birden fazla metod tanımlanabilir.
Bir sınıfı kullanmak için onun bir örneği oluşturulur ve bir değişkene atanır. Daha sonra o değişken üzerinden sınıfın özellik ve metodlarına erişilebilir.
Bir sınıfın örneği oluşturulduğunda otomatik çalışması istenen kodlar Constructor isimli özel işlevi olan kurucu metodun içinde verilir.
Bir sınıfın metodlarını başka bir sınıfta yeniden yazmak yerine sınıf miras alınabilir. extends kelimesiyle bir sınıfın (ebeveyn) tüm metod ve özellikleri
kalıtım yoluyla başka bir sınıfa (çocuk) aktarılır. Çocuk sınıf ebeveyn sınıfın bütün metodlarına ve sınıf değişkenlerine super anahtar kelimesiyle
erişebilir. Çocuk sınıfa ek metodlar eklenerek ebeveyn sınıfın yetenekleri genişletilmiş olur.
Kaynakça
Ackermann, P. (2022). JavaScript: The Comprehensive Guide to Learning Professional JavaScript Programming (First Edition.). Bonn ; Boston:
Rheinwerk Computing.
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
Horstmann, C. (2020). Modern JavaScript for the Impatient (1st edition.). Boston Columbus New York San Francisco Amsterdam Cape Town:
Addison-Wesley Professional.
Scott, A., MacDonald, M. ve Powers, S. (2021). JavaScript Cookbook: Programming the Web (3rd edition.). Beijing Boston Farnham Sebastopol
Tokyo: O’Reilly Media.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Ünite Soruları
Soru-1 :
Aşağıda verilen JavaScript kodu çalıştırıldığında sayfa çıktılanan değer hangi şıkta verilmiştir?
(A) 8
(B) 15
(C) 17
(D) 13
12
Cevap-1 :
15
Soru-2 :
(Çoktan Seçmeli)
Cevap-2 :
Soru-3 :
(Çoktan Seçmeli)
Soru-4 :
Üretici (generator) fonksiyonların kullanım amaçlarından bir tanesi aşağıdaki şıkların hangisinde verilmiştir?
(Çoktan Seçmeli)
(C) Her çağrılmada sıradaki değeri döndürür, böylece fonksiyonların çok sayıda değer döndürmesini sağlar.
Cevap-4 :
Her çağrılmada sıradaki değeri döndürür, böylece fonksiyonların çok sayıda değer döndürmesini sağlar.
(Çoktan Seçmeli)
Cevap-5 :
Soru-6 :
Üretici fonksiyonlarda sıradaki değeri döndürmek için kullanılan anahtar kelime aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
(A) yield
(B) constructor
(C) return
(D) value
(E) next
Cevap-6 :
next
Soru-7 :
Aşağıda verilen test fonksiyonun, fonksiyon ifadesiyle yazımı hangi şıkta verilmiştir?
(Çoktan Seçmeli)
Soru-8 :
(Çoktan Seçmeli)
Sınıf içinde sınıf değişkenine veya metoduna erişmek için this anahtar kelimesi kullanılır.
Cevap-8 :
Soru-9 :
Aşağıda verilen Example sınıfının örneği hangi şıkta eksiksiz ve doğru biçimde oluşturulmuş ve test metodu çağrılmıştır?
(Çoktan Seçmeli)
[Link]([Link](1, 2));
constornekSinif=newtest();
[Link]([Link](1,2));
[Link]([Link](1,2));
[Link]([Link](1,2));
letornekSinif=newExample();
[Link]([Link](1,2));
Cevap-9 :
letornekSinif=newExample();
[Link]([Link](1, 2));
Soru-10 :
Aşağıda verilen Example sınıfından miras alan Deneme isimli sınıf hangi seçenekte doğru verilmiştir?
(Çoktan Seçmeli)
Özlü Söz
"Yazılımın yeniden kullanılabilir olabilmesi için öncelikle kullanılabilir olması gerekir.”
– Ralph Johnson
Kazanımlar
1. Doküman Nesne Modeli (Document Object Model - DOM) tanımını yapabilir.
5. Dokümandaki elemanları JavaScript kullanarak ekleyebilme, kaldırabilme, değiştirebilme ve yeniden düzenleyebilme yeteneğine sahiptir.
7. getElementById, getElementsByClassName, getElementsByTagName, querySelector ve querySelectorAll gibi yöntemlerle DOM içinde eleman
seçebilir, bulabilir.
9. Metin, HTML veya CSS içeriğini DOM üzerinden nasıl manipüle edileceğini bilir.
Birlikte Düşünelim
1. Doküman Nesne Modelinin (Document Object Model - DOM) web sayfalarındaki önemi nedir?
3. DOM ağaç yapısının temel bileşenleri nelerdir? Bir HTML dokümanı DOM yapısını inceleyerek bu bileşenleri tanımlayın.
4. Bir HTML dokümanına JavaScript kullanarak yeni bir öğe eklemek, mevcut bir elemanı kaldırmak ve bir öğeyi değiştirmek mümkün olabilir mi?
5. Belirli bir HTML dokümanındaki elemanları seçmek için farklı DOM seçici yöntemleri nelerdir?
6. Bir HTML dokümanında bir elemanın içeriğini değiştirmek için nasıl bir yol izlenebilir?
7. Bir HTML dokümanında bir elemanın stili JavaScript kullanılarak nasıl değiştirilir?
8. Belirli bir HTML dokümanındaki elemanları kaldırmak için farklı yöntemler nelerdir?
9. Belirli bir öğenin özellikleri kullanılarak bir HTML elemanında değişiklik yapılması mümkün olur mu?
Başlamadan Önce
DOM yapısı, bir HTML dokümanının içeriğini, her bir elemanı ve bu elemanlar arasındaki ilişkileri bir ağaç yapısı içinde temsil etmektedir. Bu
bölümde öncelikle DOM yapısının nasıl oluşturulduğu ve organize edildiği incelenmiştir. Ardından, DOM ile nasıl etkileşime geçileceği sunulmuştur.
JavaScript kullanarak, dokümandaki öğelerin eklenmesi, silinmesi, değiştirilmesi veya yeniden düzenlenmesi gibi çeşitli manipülasyon işlemlerinin
gerçekleştirilebilmesi için gereken bilgilere yer verilmiştir. DOM içindeki elemanları seçmenin farklı yöntemleri ve bunların nasıl kullanıldığı ile
içerik manipülasyonu açıklanmıştır.
Web sayfalarının görünümünü değiştirmek için DOM üzerinde CSS manipülasyonu ile elemanların stili ve görünürlüğü gibi CSS özelliklerinin nasıl
değiştirileceği konusunda bilgilere yer verilmiştir. Ayrıca, DOM kullanarak dokümandaki elemanların manipülasyonunu nasıl gerçekleştirebileceğine
değinilmiştir. Son olarak, DOM üzerinde elemanlara ait özelliklerin (örneğin, ID, sınıf, veri özniteliği) nasıl manipüle edileceği gösterilmiştir.
Bu bölüm, web geliştirme sürecinde temel bir kavram olan DOM'un anlaşılmasına ve kullanılmasına yardımcı olacaktır. İleri seviye web uygulamaları
geliştirirken DOM'un gücünden tam anlamıyla yararlanmanıza olanak sağlayacaktır.
Kazanımlar
Birlikte Düşünelim
Başlamadan Önce
Bir web sayfasının temel yapısı aşağıdaki şekilde ifade edildiği gibi HTML, CSS ve JavaScript kodlarından oluşur.
DOM; HTML ve XML dokümanlarının “içeriğine, yapısına ve stiline dinamik olarak erişmesine ve bunları güncellemesine olanak tanıyan bir platform
ve dilden bağımsız bir arayüzdür”. DOM’un hedefi, çok çeşitli ortamlarda ve uygulamalarda kullanılabilecek standart bir programlama arayüzü
sağlamaktır. DOM kaynak kod değildir. Dokümanları hiyerarşik düzende ağaç yapısında mantıksal olarak temsil eder, nesnelere erişim için bir arayüz
sağlar.
DOM, web sayfalarının yapısını temsil eden bir programlama arayüzüdür. Bu model, HTML, XML veya XHTML gibi dokümanları bir ağaç yapısı
olarak temsil eder ve bu yapı üzerinde işlemler yapılmasını sağlar. DOM, dokümandaki bir elemana (element) hiyerarşik düzende erişilebilir, manipüle
edebilir, özellik ve stil ekleyebilir, olay ekleyebilir veya silebilir. JavaScript de bu nesne modelinin gücünden faydalanarak HTML dokümanını
dinamik hale getirir (Faizan, 2024):
Elemana Erişim: DOM, dokümandaki her bir elemana erişmek için kullanılır. Örneğin dokümanda baslik idli sahip elemanına erişmek için aşağıdaki
gibi JavaScript kodu kullanılabilir:
Eleman Biçimini Değiştirme: DOM, elemanlarının stil (style) özelliklerini değiştirmek için kullanılabilir. Örneğin bir metin alanının rengini
değiştirmek için style özelliği altındaki color parametresine istenilen renk adı veya kodu verilebilir.
Yeni Eleman Ekleme, Silme, Değiştirme: DOM, dokümana yeni elemanlar eklemek, mevcut elemanları silmek veya değiştirmek için kullanılabilir.
Örneğin bir liste elemanına aşağıdaki kodlarla yeni bir öğe eklenebilir.
Eleman Özelliklerine ve İçeriğine Erişim: DOM, elemanların özelliklerine (örneğin bir resmin URL’si) ve içeriğine (örneğin bir metin alanındaki
içerik) erişmek için kullanılabilir. Örneğin; bir görselin URL’sini almak için:
Aşağıda, temel bazı HTML elemanları kullanılarak oluşturulmuş bir web sayfası yer almaktadır. Sayfanın iç içe geçmiş HTML elemanlarından
oluştuğu görülebilir.
Örnekte verilen HTML dokümanına ait DOM ağacı aşağıdaki gibi oluşturulabilir. İşte bu ağaç yapısı, tıpkı bir organizasyon şeması gibi HTML
elemanlarının hiyerarşik düzendeki temsilini sağlar.
DOM, dokümandaki öğeleri birbirine bağlayarak bir ağaç yapısı oluşturur. Bu yapının kökü document nesnesidir ve altındaki her öğe, bu nesnenin alt
düğümleridir. Örneğin bir paragraf öğesi içinde bulunan bir başlık öğesi, DOM'da paragraf öğesinin altında bir alt öğe olarak temsil edilir. Bu
hiyerarşik yapı, HTML sayfaları tarayıcılar tarafından işlenirken kullanılır. Tarayıcılar, DOM ağacını oluşturarak ve güncelleyerek dokümandaki
öğeleri manipüle eder ve görüntüler (Patika Academy, 2024).
Doküman (document): DOM ağacının en üst düzeyinde yer alır. Bir HTML dokümanını temsil eder ve diğer tüm öğeleri içerir. Bir HTML
sayfasındaki herhangi bir elemana/öğeye erişilmek için öncelikle document nesnesine erişilmelidir (Faizan, 2024). document nesnesi, dokümandaki
tüm elemanlara ve bunların özelliklerine erişim sağlar. document nesnesine ait bazı özellikler aşağıda verilmiştir.
· [Link]: Dokümanın <html> kök elemanını temsil eden bir referans döndürür.
Örneğin bir dokümanın son erişim tarihi [Link] özelliği ile aşağıdaki gibi konsol ekranına çıktılanabilir.
Eleman/Düğüm/Öğe (Element/Node): HTML dokümanında yer alan her bir öğeyi (başlık, paragraf, resim vb.) temsil eder. Elemanlar, dokümandaki
yapının temel taşlarıdır. Her eleman; özellik, metin ve alt düğümler içerebilir. Elemanların birbiri ile ilişkisi aşağıdaki türlerden biriyle olabilir:
· Üst Öğe (Parent): Bir elemanın bir üst öğesi, onun bir üst düğümüdür. Örneğin; bir <div> içindeki bir <p> paragrafının üst öğesi <div> elemanıdır.
· Alt Öğe (Child): Bir elemanın alt öğeleri, onun alt düğümleridir. Örneğin; bir <div> elemanı içindeki herhangi bir <p> paragrafı, <div>'in alt
öğesidir.
· Kardeş Öğe (Sibling): Aynı düzeyde (aynı üst öğeye sahip) bulunan elemanlar birbirlerinin kardeşidir. Örneğin; aynı <div> içindeki iki farklı <p>
paragrafı birbirlerinin kardeşleridir.
Özellik (Attribute): Bir HTML elemanının özelliklerini temsil eder. Örneğin; bir resmin src özelliği, resmin kaynak URL’sini içerir.
Yazı (Text): HTML dokümanındaki metni temsil eder. Örneğin; bir paragrafın içinde yer alan metin.
Yorum (Comment): HTML dokümanındaki yorumları temsil eder. Yorumlar, dokümana açıklama eklemek için kullanılır ve genellikle tarayıcılar
tarafından görüntülenmez.
DOM bileşenleri birbirleriyle etkileşime girerek web sayfasının yapısını oluştururlar. document, içerisindeki eleman ve yorum düğümleriyle birlikte
tüm dokümanı temsil eder. Elemanlar, birbirleriyle üst öğe-alt öğe ilişkisi içinde olabilirler. Bir eleman, içinde başka eleman veya metin
bulundurabilir. Kardeş elemanlar, aynı düzeyde (aynı üst öğeye sahip) bulunur ve birbiriyle aynı düzeyde etkileşime girerler. Örneğin; CSS ile kardeş
elemanlara farklı stiller uygulanabilir. Özellikler, elemanların özelliklerini tanımlar ve elemanların davranışını veya görünümünü değiştirmek için
kullanılır. Yazı düğümleri, elemanların içeriğini temsil eder ve elemanların içeriğini değiştirmek için kullanılabilir. Yorumlar ise, dokümana ek
açıklamalar veya notlar eklemek için kullanılır ve genellikle tarayıcılar tarafından görüntülenmez; ancak doküman yapısının anlaşılması için
önemlidir.
DOM ile web sayfasının içeriği, stili ve davranışı değiştirilebilir. DOM ile manipülasyon, web geliştiricilerin web sayfalarını dinamik ve etkileşimli
hale getirmelerini sağlamaktadır. Böylece kullanıcı deneyimi artırabilir, içerik güncellenebilir ve sayfanın görünümü istenildiği gibi şekillendirilebilir.
Doküman üzerindeki bir elemanı manipüle etmek için önce o elemanı seçmek gerekmektedir. HTML sayfasındaki bir eleman DOM ile aşağıdaki
yöntemlerden biriyle seçilebilir:
[Link](id): Bu metod, HTML sayfasındaki bir elemanı id özelliğine göre seçmek için kullanılır. idsi belirtilen elemanın yalnızca
bir tane olması gerekir çünkü her id benzersiz olmalıdır. Bu yöntem, DOM içinde elemanlara hızlı bir erişim sağlar.
Örneğin aşağıdaki HTML kodunda “elemanim” idsine sahip div öğesi verilmiştir.
Aşağıdaki JavaScript kodunda ise getElementById() metoduyla “elemanim” idsine sahip div öğesi seçilmekte ve eleman değişkenine atanmaktadır.
Böylece JavaScript kodunun devamında bu değişken aracılığıyla bu div öğesine erişilebilir ve onunla etkileşime geçilebilir veya manipüle edilebilir.
[Link](name): Bu metod, HTML sayfasındaki bir elemanı name özelliğine göre seçmek için kullanılır. Aynı isme sahip
birden fazla eleman olabilir, bu nedenle döndürülen sonuç bir NodeList olacaktır.
Örneğin aşağıdaki HTML kodunda verilen onay kutusu (checkbox) türünde input öğesinin aynı isme (renk) sahip olduğu görülebilir.
Aşağıdaki JavaScript kodu ise renk ismindeki bu input öğelerini [Link]() yöntemiyle seçmektedir.
Yukarıdaki kod satırında “renk” adına sahip olan tüm input öğelerini içeren NodeList, renkler değişkenine atanmıştır. JavaScript kodunun devamında
renkler değişkeniyle verilen isme sahip öğelerle etkileşime geçilebilir.
[Link](tag): Bu metod, belirli bir etikete sahip tüm elemanları seçmek için kullanılır. Örneğin HTML kodunda
aşağıdaki gibi “div” etiketine sahip elemanlar olsun.
<div>İÜ</div>
<div>AUZEF</div>
<div>Bilgisayar Programcılığı</div>
Aşağıdaki JavaScript kodu “div” etiketine sahip tüm elemanları [Link]() yöntemiyle seçmektedir.
[Link](class): Bu metod, belirli bir sınıfa sahip tüm elemanları seçmek için kullanılır. Örneğin, “sinif” adında bir
sınıfa sahip tüm elemanların seçilmesi için bu metod kullanılabilir.
[Link](): Bu metod, CSS seçicileri kullanarak belirli bir elemanı seçmek için kullanılır. Metod verilen seçiciyle eşleşen ilk elemanı
döndürür.
<body>
<p>İlk paragrafım</p>
</body>
Aşağıdaki JavaScript kodunda “sinif” isimli sınıfa ait ilk paragrafın döndürülmesi için document. querySelector() yöntemi kullanılmıştır.
[Link]("[Link]");
[Link]() metodu etiket adı, sınıf adı, id veya diğer özelliklerle birlikte kullanılabilir. Örneğin [Link]() ile idsi
“isim_soyad” olan eleman aşağıdaki satırla seçilebilir.
[Link]("#isim_soyad");
[Link]() ile üst öğesi h1 olan ilk paragraf elemanı aşağıdaki satırla seçilebilir.
[Link]() ile target özelliği olan ilk çapa/anchor elemanı aşağıdaki satırla seçilebilir.
[Link]() metodu seçici ile eşleşen ilk elemanı döndürmekteydi. Seçici ile eşleşen tüm elemanların döndürülmesi için
querySelectorAll() metodu kullanılabilir. Böylece CSS sorgusu ile eşleşen tüm HTML elemanları listelenecektir. Aşağıda verilen JavaScript kodu ile
“sinif” sınıfına ait olan tüm paragraflar seçilecek, ilk paragraf nesnesi deg[0], ikincisi ise deg[1] olarak tutulacaktır.
[Link]: Ebeveyn elemana erişir. Örneğin HTML kodunda aşağıdaki div ve içinde p etiketi olsun.
<div id="parent">
</div>
Aşağıdaki JavaScript kodunun ilk satırında [Link]() metoduyla idsi child olan paragraf seçilmiş ve childElement isimli değişkene
atanmıştır. İkinci satırda child elemanının içinde yer aldığı ebeveyn parentNode ile seçilmiş ve sonraki satırda konsola çıktılanmıştır.
[Link]: Ebeveyn elemanın ilk düğümüne erişir. Örneğin HTML kodunda aşağıdaki elemanlar olsun.
Aşağıdaki JavaScript kodunun ilk satırında [Link]() metoduyla idsi parent olan div seçilmiş ve parentElement isimli değişkene
atanmıştır. İkinci satırda ebeveyn elemanın ilk düğümü olan paragraf etiketi firstChild ile seçilmiş ve sonraki satırda konsola çıktılanmıştır.
[Link]: Ebeveyn elemanın son düğümüne erişir. Örneğin HTML kodunda aşağıdaki elemanlar olsun.
Aşağıdaki JavaScript kodunun ilk satırında [Link]() metoduyla idsi parent olan div seçilmiş ve parentElement isimli değişkene
atanmıştır. İkinci satırda ebeveyn elemanın son düğümü olan span etiketi lastChild ile seçilmiş ve sonraki satırda konsola çıktılanmıştır.
[Link]: Bir önceki kardeş elemana erişir. [Link]: Bir sonraki kardeş elemana erişir.
Aşağıdaki JavaScript kodunun ilk satırında [Link]() metoduyla idsi middle olan div seçilmiş ve middleElement isimli değişkene
atanmıştır. İkinci satırda bu elemanın bir önceki kardeş elemanı olan ilk paragraf previousElementSibling ile seçilmiş, sonraki satırda bu elemanın bir
sonraki kardeş elemanı olan üçüncü paragraf nextElementSibling ile seçilmiş ve sonraki satırlarda bunlar konsola çıktılanmıştır.
Bir HTML elemanının içeriğini değiştirmek veya içeriğine erişmek için [Link], [Link] ve [Link]
kullanılabilir; ancak her biri farklı davranış göstermektedir.
[Link]: innerHTML özelliği, bir elemanın içeriğini temsil eden HTML veya metni alır veya ayarlar. Bu özellik, eleman içindeki tüm
HTML kodunu alır veya değiştirir. Bu nedenle, içindeki HTML etiketleri değiştirilebilir veya yeni etiketler eklenebilir.
Diğer bir örnek olarak; bir <h2> başlığın içinde İÜ yazıldığı düşünülsün. Bu içeriğin İÜ AUZEF haline getirilebilmesi için aşağıdaki kodlar
kullanılabilir.
[Link]: textContent özelliği, bir elemanın içeriğini temsil eden metni alır veya ayarlar. innerText gibi, bu özellik de HTML etiketlerini
dikkate almaz ve yalnızca metni alır veya ayarlar. innerText’den farklı olarak, textContent içindeki tüm metni alır, yani iç içe geçmiş elemanların
içeriğini de alır.
Bir elemanın CSS özelliklerine DOM ile erişilebilir ve istenen CSS özelliği değiştirilebilir. CSS manipülasyonunda kullanılabilecek bazı DOM öğeleri
Tablo 12’de verilmiş olup, bu öğeler tablodan sonra kısaca açıklanmıştır.
Bu özelliklerle ilgili birkaç örnek aşağıda verilmiştir. Aşağıdaki satır belirli bir elementin arka plan rengini kırmızı olarak ayarlar. Sonraki satır
elementin kenarlığını sürekli, siyah renk ve 1px kalınlığında ayarlar.
[Link] = "red";
Aşağıdaki satır dokümandaki ilk <table> öğesinin içindeki ilk <th> ve <td> öğelerinden herhangi birini seçer ve bu öğeyi element adında bir
değişkene atar. Sonraki satır ise seçili elementin kenarlığını siyah ve 1px kalınlığında ayarlar.
Tablo 12’de verilen DOM öğeleri aşağıda kısaca açıklanmıştır ([Link], 2024).
· background: Arka plan özelliklerini tanımlar (renk, resim, tekrarlama, konum vb.).
· backgroundAttachment: Arka plan resminin sayfaya bağlı mı yoksa kaydırıldığında sabit mi kalacağını belirler.
[Link] = "pink";
[Link] = "url('[Link]')";
[Link]("myDiv").[Link] = "lightblue";
[Link]("paragrafim").[Link] = "none";
[Link]("myImg").[Link] = "grayscale(50%)";
[Link]("metin").[Link] = "200";
[Link] = "20px";
<p id="paragraph">İÜ</p>
[Link] = "right";
[Link] = "20px";
[Link]("myTd").[Link] = "top";
[Link] = "hidden";
[Link]("girisDugmesi").[Link] = "250px";
· [Link](element)
Oluşturulan elemanı sayfaya dinamik olarak eklemek için append veya appendChild metodu kullanılır.
· [Link](child)
· [Link](child)
Bu üç metoda ilişkin örnek aşağıda verilmiştir. İlk satırda [Link]() ile yeni bir div elemanı oluşturulmuş ve yeniDiv değişkenine
atanmıştır. İkinci satırda oluşturulan div elemanının içeriği innerHTML özelliğiyle “Div içeriği” olarak ayarlanmıştır. Son satırda oluşturulan div
elemanı appendChild() metoduyla dokümana eklenir. appendChild() metodu, dokümandaki bir öğenin alt elemanlarından birini belirtilen öğenin
sonuna ekler.
[Link](yeniDiv);
Yeni oluşturulan bir eleman belirli bir elemandan önce veya sonra eklenebilir. Bunun için after(), before(), insertBefore(), insertAfter() metodları
kullanılır.
[Link](eklenecekElement);
[Link](eklenecekElement);
[Link](eklenecekElement, mevcutelement);
[Link](eklenecekElement, mevcutelement);
before() metodunu örneklemek için verilen aşağıdaki JavaScript kodunun ilk satırında dokümandaki ilk table elemanı [Link]('table')
ile seçilmiş ve tablo değişkenine atanmıştır. İkinci satırda [Link]('p') komutuyla yeni bir p, paragraf elemanı oluşturmuş ve
yeniParagraf değişkenine atanmıştır. Bu paragrafın içeriği innerText özelliğiyle “insert before Örneği” olarak ayarlanmıştır. Son satırda
[Link](yeniParagraf) komutuyla oluşturulan yeni paragraf (yeniParagraf) tablodan önce dokümana eklenmiştir. Eğer tablodan sonra eklenmek
istenirse [Link](yeniParagraf) şeklinde kullanılabilir.
[Link]();
[Link](silinecekElement);
[Link]('parent_div').remove();
[Link](silinecekElement);
Bir elemanı değiştirmek için replaceChild() metodu, elemanı olduğu gibi klonlamak için cloneNode() metodu kullanılır.
[Link](eski, yeni);
[Link]();
[Link](ozellik): Bu metod, bir elemanın özelliğinin değerini alır. Örneğin bir a etiketinin (link/çapa/anchor) href özelliğini almak için
kullanılabilir.
Yukarıda verilen link JavaScript koduyla aşağıdaki gibi seçilip href özelliği konsola çıktılanabilir.
[Link](ozellik, deger): Bu metod, bir HTML öğesine belirli bir nitelik atar veya mevcut özelliğin değerini değiştirir.
[Link]("href","[Link]
[Link](ozellik): Bu metod, belirtilen özelliğin bir HTML öğesinde mevcut olup olmadığını kontrol eder. Nitelik varsa true, yoksa
false döndürür.
[Link]("href");
Aşağıda DOM ile özellik manipülasyonu yapan metodların kullanım örnekleri verilmiştir.
JavaScript dilinde DOM API aracılığıyla web sayfasındaki bir eleman oluşturulabilir, silinebilir, herhangi bir elemana erişilebilir, elemanın biçimi
değiştirilebilir.
Bu bölümde; DOM’un tanımından başlayarak, DOM ağaç yapısı ve JavaScript ile DOM’un gücünden faydalanarak bir HTML sayfasında
yapabildikleri konusunda bilgiler verilmiştir.
Kaynakça
Faizan, P. (2024). Javascript HTML DOM. [Link]
Ünite Soruları
Soru-1 :
(Çoktan Seçmeli)
Cevap-1 :
Soru-2 :
(Çoktan Seçmeli)
(B) HTML dokümanlarını işlemek için kullanılan bir uygulama programlama arabirimidir (API’dir).
Cevap-2 :
HTML dokümanlarını işlemek için kullanılan bir uygulama programlama arabirimidir (API’dir).
Soru-3 :
Yukarıda verilen bir HTML dökümanının DOM ağacı kesitine göre aşağıdaki elemanlardan hangisi bu HTML dokümanında yer almaz?
(Çoktan Seçmeli)
(B) Resim
(C) Link
div
Cevap-3 :
Resim
Soru-4 :
(Çoktan Seçmeli)
(A) 6. dereceden başlık (h6) ve anchor/çapa (a) elemanları paragrafın (p) alt öğeleridir.
p, h6, a, h2, h1, table, tr, div ve img elemanlarının tümü body elemanının alt öğeleridir.
Cevap-4 :
Soru-5 :
DOM ile bir elemanın dış kenar boşluğu hangi CSS özelliği ile ayarlanır?
(Çoktan Seçmeli)
(A) border
(B) position
(C) space
(D) padding
(E) margin
Cevap-5 :
margin
Soru-6 :
Aşağıdakilerden hangisiHTML dokümanındaki <a> (anchor/çapa) elementlerini içeren bir koleksiyon döndürür?
(Çoktan Seçmeli)
(B) [Link]
(C) [Link]
(D) [Link]
[Link]
Cevap-6 :
[Link]
Soru-7 :
Yukarıda verilen div elemanını id özelliğine göre seçmek için aşağıdaki seçeneklerden hangisi kullanılmalıdır?
(Çoktan Seçmeli)
(A) [Link]("id_");
(B) document.getElementBy_id();
(C) [Link]("ad_");
(D) [Link]("sinif_");
[Link]("div.sinif_");
Cevap-7 :
[Link]("id_");
Soru-8 :
hedef isimli HTML elemanından önce başka bir eleman eklemek için hangi metod kullanılır?
(Çoktan Seçmeli)
(A) [Link](element);
(B) [Link](element);
(C) [Link](element);
(D) [Link](element);
[Link](element);
Cevap-8 :
[Link](element);
Soru-9 :
Aşağıdaki tablo kenarlığının 5px, solid ve kenarlık renginin kırmızı olmasını sağlayan JavaScript kodu hangi seçenekte yer almaktadır?
Cevap-9 :
Soru-10 :
Aşağıda JavaScript kodu ile oluşturulan bağlantının HTML dokümanına eklenebilmesi için … verilen yere aşağıdaki seçeneklerden hangisi
getirilmelidir?
(Çoktan Seçmeli)
(A) [Link](anc);
(B) [Link](a);
(C) [Link](anc);
[Link](anc);
Cevap-10 :
[Link](anc);
Özlü Söz
“Hangi çalışma alanına girmek isterseniz isteyin, en az bir programlama dili öğrenmek büyük önem taşıyor.”
– Ram Ray
Kazanımlar
1. JavaScript olay kavramını ve bileşenlerini bilir.
4. Pencere, form, klavye, fare gibi kullanıcının en sık etkileşimde bilindiği olayları bilir ve tanımlayabilir.
Birlikte Düşünelim
1. Web sayfasında butona basıldığında veya içerik girildiğinde yapılması istenenler nasıl gerçekleştirilir?
7. Kullanıcı tarayıcı penceresiyle etkileşime nasıl girebilir? Pencerenin kapandığını veya başka bir sekmeye geçildiği bilinebilir mi?
8. Form içeriğinin bir butona basıldığında gönderilmesi, temizlenmesi veya formda bir hata olması hangi olaylarla ilişkilidir?
9. Klavye oayları nelerdir? Bir input alanına veri girerken bir butona basmaya gerek kalmadan otomatik hesaplama hangi olayı kullanarak yapılır?
10. Bir elemanın fareyle üzerine gelindiği nasıl bilinir? Aynı şekilde fare elemanın üzerine gittiğinde bir olay tanımlanabilir mi? Örneğin bir resmin
üzerine gelindiğinde açıklama yazısının görüntülenmesi, fare resmin üzerinden gittiğinde bu açıklama yazısının gitmesi hangi olaylarla yapılır?
11. Şifre girilmesi gereken bir input alanına panodaki içeriğin kopyalanması engellenebilir mi? Kullanıcıyı şifre yazmaya mecbur etmek mümkün
müdür?
12. Bir eleman sürüklenip bırakıldığında ne tür olaylar meydana gelir? Bunların bir zaman sıralaması var mıdır?
Başlamadan Önce
Web sayfalarının iskeletini oluşturan HTML elemanları etkileşim olmazsa son derece işlevsel, sade bir belgeden farksızdır. Bu sebeple web sayfalarına
dinamizm kazandırmak ve kullanıcının sayfayla olan etkileşimini artırmak için JavaScript dilinde olaylar kullanılır.
Olaylar üç temel bileşene sahiptir: Olayın gerçekleşeceği hedef eleman, olay adı ve olay meydana geldiğinde yapılacak işler. Dolayısıyla bir olay
tanımlanırken hangi doküman elemanı veya elemanları için geçerli olduğu seçilmelidir. Bu sebeple bir önceki bölümde ele alınan DOM seçicileri iyi
bilinmelidir. İkinci olarak olay türleri bilinmelidir. Sık kullanılan pencere olayı, form olayı veya form elemanlarının işlevlerine göre yapabileceği
olaylar, klavye ve fare olayları özellikle çok iyi bilinmelidir. Son olarak bir olay olduğunda neler yapılacağı olay gövdesinin içinde verilmelidir.
Bu bölümde, kullanıcının web sayfası ile nasıl etkileşimde bulunacağı, olay kavramı ve olay bileşenleri ve türleri ele alınmaktadır. Olay kategorileri
Kazanımlar
Birlikte Düşünelim
Başlamadan Önce
8.1. Olaylar
JavaScript dili, HTML sayfasındaki içerik ve yapıyla kullanıcının etkileşimini sağlamak için geliştirilmiş bir dildir. Kullanıcı bir butona tıkladığında,
bir form elemanına içerik girdiğinde, bir form elemanından birini veya birkaçını seçtiğinde, sürükleyip bıraktığında, bir elamanın üzerinden fareyle
geçtiğinde, klavyeden bir tuşa bastığında vb. herhangi bir etkileşimde bulunduğunda JavaScript dilinde tanımlı olay (event) çalıştırılır. JavaScript dili,
olaylar sayesinde sayfanın dinamik ve etkileşimli kullanımını sağlar.
Örneğin bir butona tıklandığında yapılacakları işlemek için öncelikle dokümanda o buton seçilmelidir. Örneğin sayfada kaydet idli butonu bir önceki
bölümde ele alınan element seçme yöntemlerinden biriyle id değerine göre aşağıdaki gibi seçelim ve kaydetButonu olarak isimlendirelim.
Akabinde olay tıklama (click) olayı olduğu için [Link] olayı işletilecektir. Bu olay olduğunda çalışacak kodlar ise süslü parantezler
arasında anonim fonksiyon kullanılarak verilebilir.
JavaScript dilinde olaylar geleneksel yöntem ile ve olay dinleyicisi ile işlenmektedir.
Klasik yöntemde bir elemana ait olay on önekiyle işlenir (Flanagan, 2020; MDN, 2024a; Svekis, Putten ve Percival, 2021; w3schools, 2024). Örneğin
bir elementin tıklanma olayını işlemek için onclick, kontrol bir olaya geçtiğinde yapılacakları işlemek için onfocus, bir elementin içeriği değiştiğinde
Aşağıda kaynak kodu verilen web sayfasındaki İçerik Değiştir butonuna tıklandığında icerik alanının içeriği “Dünya” olarak değiştirilmektedir. Bu
amaçla öncelikle hedef eleman yani buton seçilmelidir. Kod incelendiğinde İçerik Değiştir butonu id alanına göre aşağıdaki kod satırıyla seçilmiştir.
Akabinde tıklama olayı onclick olarak belirtilmiş ve daha sonra da anonim fonksiyon içerisinde olay meydana geldiğinde (buton tıklandığında) içerik
alanını “Merhaba” olarak değiştirecek kod verilmiştir.
[Link]("icerik").innerText = "Dünya";
Sayfada butonun click olayına (onclick) icerikDegistir isimli fonksiyon verilmiştir. Yani kullanıcı butona bastığında icerikDegistir fonksiyonu
çalışacaktır. Butona basmadan önce (sol) ve bastıktan sonra (sağ) sayfanın görüntüsü aşağıda verilmiştir.
Klasik yöntemle bir olay işlenirken olayın kodları anonim bir fonksiyon yerine isimli bir fonksiyonla da verilebilir. Böylece bu fonksiyon sadece o
olay için değil başka olaylar için de ismiyle çağrılıp tekrar kullanılabilir.
Yukarıda verilen örnek, bu sefer butona tıklandığında isimsiz fonksiyon yerine icerikDegistir() isimli fonksiyonun çalışması sağlanmıştır. <script>
</script> bloğunda fonksiyonun kodu verilmiştir. Böylece icerikDegistir() fonksiyonu başka olaylar için de ismiyle çağrılarak çalıştırılabilir. Aşağıda
bu kullanımın kodu verilmiştir.
Geleneksel yöntemde bir elemana bağlı olarak yalnızca bir olay çalıştırılmaktaydı. Olay dinleyicileri ise bir elemana bağlı olarak birden fazla olayın
çalıştırılmasını sağlar. Bu yöntemde olaydan önce on öneki kullanılmaz. Örneğin tıklama olayı işlenecekse click, yüklenme olayı işlenecekse load
yazılır. addEventListener() metoduyla ile tanımlanan olay dinleyici sözdizimi aşağıda verilmiştir (Flanagan, 2020; MDN, 2024a; Svekis ve diğerleri,
2021; w3schools, 2024).
kod satırı1;
kod satırı2;
});
Geleneksel yöntemde verilen butona tıklandığında içerik alanını değiştiren örnek olay dinleyicisi ile de çalıştırılabilir. İçerik Değiştir butonu
querySelector metoduyla aşağıdaki gibi seçilmiştir.
Olay dinleyicisi ile benzer şekilde bir elementten bir olayı kaldırmak için removeEventListener() metodu kullanılır.
Olay Açıklama
DOMContentLoaded HTML elemanları (DOM) tamamen yüklendiğinde tetiklenir.
onabort Bir dosyanın, kaynağın (resim, görüntü vb) yüklenmesi iptal edildiğinde tetiklenir.
onafterprint Bir sayfa basıldığında tetiklenir.
onbeforeprint Bir sayfa basılmadan önce tetiklenir.
onbeforeunload Kullanıcı sayfadan ayrılmadan önce tetiklenir.
onerror Bir hata meydana geldiğinde tetiklenir.
onhashchange Sayfa linkinin (URL) hash değeri değiştiğinde tetiklenir.
onload Sayfanın yüklenmesi tamamlandığında tetiklenir.
onmessage Tarayıcı pencereleri arasında veya iframe çerçeveleri arasında iletişim gerçekleştiğinde tetiklenir.
onoffline Tarayıcı çevrimdışı olduğunda tetiklenir.
ononline Tarayıcı çevrimiçi olduğunda tetiklenir.
onpagehide Kullanıcı bir sayfadan ayrıldığında tetiklenir.
onpageshow Kullanıcı bir sayfayı görüntülediğinde tetiklenir.
onpopstate Geçmiş durumu değiştiğinde tetiklenir (ileri veya geri düğmesi).
onreadystatechange Tarayıcı penceresinin hazır olma durumu değiştiğinde tetiklenir.
onresize Tarayıcı penceresi yeniden boyutlandırıldığında tetiklenir.
onscroll Sayfa içinde kaydırma yapıldığında tetiklenir.
onstorage Tarayıcı depolama alanı veya çerez depolama alanı değiştiğinde tetiklenir.
onunload Tarayıcı penceresi kapatıldığında tetiklenir.
Örneğin tarayıcı sayfasının yeniden boyutlandırıldığında bir uyarı penceresinde bu durumu kullanıcıya bildirmek için onresize olayı kullanılır. Sayfa
yüklendiğinde kullanıcıyı uyarı penceresiyle bilgilendirmek için onload olayı kullanılır. Buna ilişkin örnek aşağıda verilmiştir.
Olay Açıklama
scroll Sayfa veya bir elementin içeriği kaydırıldığında tetiklenir.
scrollTo Sayfayı verilen koordinatlara (x-yatay, y-dikey) kaydırmak için kullanılır.
scrollBy Sayfayı verilen mesafe kadar koordinatlara (x-yatay, y-dikey) kaydırmak için kullanılır.
onwheel Farenin tekeri aşağı veya yukarı döndürüldüğünde tetiklenir.
scrollEnd Sayfa veya bir elementin içeriğinin kaydırılması tamamladığında tetiklenir.
Örneğin sayfayı 750 piksel yatay, 250 piksel dikey konumuna kaydırmak için scrollTo metodu aşağıdaki gibi kullanılabilir.
[Link](750, 250);
Sayfayı mevcut konumundan 50 piksel sağa, 150 piksel aşağıya kaydırmak için ise scrollBy metodu aşağıdaki gibi kullanılabilir.
[Link](50, 150);
Tarayıcı penceresinin veya bir elementin mevcut kaydırma konumunu kontrol etmek veya istenilen konuma ayarlamak için Tablo 15’te verilen dört
Olay Açıklama
scrollX Pencerenin veya bir elementin yatay kaydırma konumunu (sol-sağ) piksel cinsinden döner. Sadece okunabilir (readonly)
özelliktir, değiştirilemez.
scrollY Pencerenin veya bir elementin dikey kaydırma konumunu (yukarı-aşağı) piksel cinsinden döner. Sadece okunabilir
(readonly) özelliktir, değiştirilemez.
scrollLeft Pencerenin veya bir elementin yatay kaydırma pozisyonunu döner veya ayarlar. Değiştirilebilir özelliktir.
scrollTop Pencerenin veya bir elementin dikey kaydırma pozisyonunu döner veya ayarlar. Değiştirilebilir özelliktir.
Örneğin sayfadaki icerikDegistirButonu dikey konumunu 750 piksele ayarlamak için scrollTop, yatay konumunu 250 piksele ayarlamak içinse
scrollLeft özelliği aşağıdaki gibi kullanılabilir.
Olay Açıklama
onfocus Kontrol bir elemana verildiğinde tetiklenir.
onblur Elemandan kontrol kaldırıldığında (kaybettiği anda) tetiklenir.
onchange Elemanın değeri değiştiği anda tetiklenir.
oncontextmenu Bir elemana sağ tıklandığında tetiklenir. Sağ tıklandığında gösterilecek menü için kullanılır.
oninput Kullanıcı bir elemana veri girdiğinde tetiklenir.
oninvalid Bir eleman geçersiz olduğunda tetiklenir.
onreset Form elemanlarına girilen/değiştirilen/atanan değerleri ilk haline döndürmek için kullanılır.
onsearch Kullanıcı <input="search"> elemanına bir şey yazdığında tetiklenir.
onselect Bir eleman veya içeriği seçildiğinde tetiklenir
onsubmit Form göndermek için tetiklenir.
ontoggle Bir öğe göster/gizle yapıldığında tetiklenir. Öğe gösteriliyorsa gizlenir, gizliyse gösterilir.
Örneğin sayi1 idli form elemanından kontrol bir başka elemana geçtiğinde bir uyarı penceresiyle kullanıcıyı bilgilendirmek için onblur olayı kullanılır.
Olay Açıklama
onclick Eleman üzerine fareyle (sol) tıklandığında tetiklenir.
ondblclick Fare bir elemana çift tıkladığında (sol) tetiklenir.
onmousedown Bir eleman üzerinde fareye tıklandığında tetiklenir.
onmousemove Fare imleci bir elemanın üzerindeyken hareket ettiğinde tetiklenir.
onmouseout Fare imleci bir elemanın dışına çıktığında tetiklenir.
onmouseover Fare imleci bir elemanın üzerine geldiğinde tetiklenir.
onmouseup Bir elemanın üzerinde fare düğmesi bırakıldığında tetiklenir.
onwheel Fare tekerleği bir elemanın üzerinde yukarı veya aşağı yuvarlandığında tetiklenir.
Örneğin fare sayi1 isimli inputun üzerine geldiğinde o inputun renginin kırmızı olması için onmouseover olayı, fare elemanın üzerinden çıktığında
kahverengi olması için onmouseout olayı kullanılır. Bunu sağlayan JavaScript kodu aşağıda verilmiştir.
Olay Açıklama
onkeydown Klavyede bir tuşa basıldığında tetiklenir.
onkeypress Klavyede bir tuşa basılı olduğu sürece tetiklenir.
onkeyup Klavyede basılı bir tuştan parmak geri çekildiğinde tetiklenir.
Kullanıcı sayi1 form elemanı aktifken klavyeden bir tuşa bastığında onkeydown olayıyla sayi1 elemanının arka planının mavi, sayi2 elemanında
klavyeden bir tuşa bastıktan sonra tuşu geri bıraktığında sayi1 ve sayi2 alanlarına girilen değerlerin toplamını toplam idli form elemanına eşzamanlı
yazdıran onkeyup olaylarının örneklendiği JavaScript kodu aşağıda verilmiştir.
Olay Açıklama
oncopy Kullanıcı bir elementin içeriğini kopyaladığında tetiklenir.
Örneğin sayi1 isimli form elemanına bir içerik kopyalandığında, yapıştırıldığında ve kesildiğinde tetiklenen pano olaylarından sonra kullanıcıyı alert
uyarı penceresiyle bilgilendiren Web sayfası ve JavaScript kodu aşağıda verilmiştir.
sayi1 idli input elemanında kopyala, yapıştır ve kes olayları gerçekleştiğinde aşağıdaki uyarı ekranları görüntülenecektir.
Olay Açıklama
ondrag Bir eleman sürüklendiğinde tetiklenir.
ondragend Sürükleme işleminin sonunda tetiklenir.
ondragenter Bir eleman geçerli bir bırakma hedefine sürüklendiğinde tetiklenir.
ondragleave Bir eleman geçerli bir bırakma hedefinden ayrıldığında tetiklenir.
ondragover Bir eleman geçerli bir bırakma hedefi üzerine sürüklendiğinde tetiklenir.
ondragstart Sürükleme işleminin başlangıcında tetiklenir.
ondrop Sürüklenen eleman bırakıldığında tetiklenir.
Örneğin siyah renkli içi dolu bir dairenin turuncu renkli bir dikdörtgenin içine sürüklenip bırakılmasını sağlayan Web sayfası ve JavaScript kodu
aşağıda verilmiştir. Sayfada siyah renkli dairenin sürüklenebilir olmasını sağlamak için draggable özelliği true ayarlanmıştır. Sürükleme-bırakma olayı
sonrası daireyle birlikte dairenin içindeki yazı da turuncu renkli dikdörtgende yer alacaktır.
JavaScript dili, web sayfalarında kullanıcı etkileşimi doğrultusunda çeşitli iş ve işlevleri gerçekleştirmek için kullanılır. Olaylar doküman (web
sayfası) üzerindeki herhangi bir eleman ile yapılabilecek işlevleri ifade eder. Web sayfasının daha dinamik ve kullanıcı etkileşimli olabilmesi için
olaylar kullanılır.
Olay yönetimi üç bileşenden oluşur: olayın tetiklendiği eleman, olayın ismi ve olay tetiklendiğinde çalışacak kodlar. JavaScript dilinde [Link]
= function (){} benzeri klasik sözdizimle ve addEventListener olay dinleyicisi ile olay oluşturulabilir.
JavaScript dilinde sayfanın görüntülendiği tarayıcı penceresi (window nesnesiyle) ilgili olaylar, form ve form elemanlarıyla ilgili olaylar, fare ve
klavye etkileşimine dayalı olaylar, kullanıcı bir form elemanının içeriğini kopyaladığında, yapıştırdığında ve kestiğinde tetiklenen pano olayları, form
elemanlarını sürükleme ve bırakma ile ilgili tetiklenen, sayfa veya elemanın yerini konumlandırma ve kaydırma çubuğu ile ilgili olaylar tanımlıdır.
Kaynakça
Flanagan, D. (2020). JavaScript: The Definitive Guide: Master the World’s Most-Used Programming Language (7th edition.). Sebastopol, CA:
O’Reilly Media.
MDN. (2023a). Element: scrollBy() method - Web APIs | MDN. [Link] adresinden
erişildi.
MDN. (2023b). Element: scrollTo() method - Web APIs | MDN. [Link] adresinden
erişildi.
Svekis, L. L., Putten, M. van ve Percival, C. B. R. (2021). JavaScript from Beginner to Professional: Learn JavaScript quickly by building fun,
interactive, and dynamic web apps, games, and pages. Erscheinungsort nicht ermittelbar: Packt Publishing.
Soru-1 :
HTML dokümanında yer alan "sorustur" sınıflı butonu seçen ve bunun tıklama olayını işleyen JavaScript kodları aşağıdaki hangi seçenekte
verilmiştir?
(Çoktan Seçmeli)
Cevap-1 :
Soru-2 :
Aşağıdaki olaylardan hangisi bir dosyanın, kaynağın (resim, görüntü vb) yüklenmesi iptal edildiğinde tetiklenir?
(Çoktan Seçmeli)
(A) onabort
(B) onerror
(D) oncancel
onreset
Cevap-2 :
onabort
Soru-3 :
Sayfa veya bir elementin içeriği kaydırıldığında tetiklenen kaydırma olayı aşağıdakilerden hangisidir?
(Çoktan Seçmeli)
(A) scrollBy
(B) scrollTo
(C) scroll
(D) onwheel
scrollEnd
Cevap-3 :
scroll
Soru-4 :
(Çoktan Seçmeli)
Cevap-4 :
Soru-5 :
Kullanıcı fareyi hedef isimli butonun üzerinden çektiğinde tetiklenen olayın kodu hangi seçenekte verilmiştir?
(Çoktan Seçmeli)
Soru-6 :
Aşağıdaki şıklardan hangisinde hedef isimli elementte kullanıcının bir tuşa basması ve bir içeriği yapıştırması olayı işlenmiştir?
(Çoktan Seçmeli)
Cevap-6 :
(Çoktan Seçmeli)
(A) ondrag
(B) ondragend
(C) ondragover
(D) ondrop
ondropend
Cevap-7 :
ondrop
Soru-8 :
Sayfayı mevcut konumundan 40 piksel sağa, 30 piksel aşağıya kaydıran kod satırı aşağıdaki seçeneklerin hangisinde verilmiştir?
(Çoktan Seçmeli)
[Link](30,40);
Cevap-8 :
[Link](40, 30);
Soru-9 :
(Çoktan Seçmeli)
(A) onreadystatechange
(B) onwheel
(C) ononline
(D) onresize
onstorage
Cevap-9 :
onwheel
Soru-10 :
(Çoktan Seçmeli)
Cevap-10 :