1. undefined ve null: Kardeş Ama Farklı!
JavaScript’te bir değişkeni kontrol ettiğinizde bazen undefined ve null ile karşılaşırsınız. Ama bu ikisi o kadar benzer görünebilir ki, genellikle karıştırılır.
```javascript
let a;
if (a == null) {
console.log("Değer yok");
}
```
Çıktı: "Değer yok", ama neden?
Çözüm:
JavaScript'te `null` ve `undefined` eşittir (==), ancak farklı türlerdir (===). == operatörü iki değeri eşit kabul ederken, === yalnızca aynı türde olmaları gerektiğini denetler. Bu nedenle, tip güvenliği sağlamak için === kullanmalısınız.
let a;
if (a === null) {
console.log("Değer gerçekten null");
} else if (a === undefined) {
console.log("Değer undefined");
}
2. Fakat... Yine de NaN!
JavaScript’te `NaN` (Not-a-Number) gerçekten ilginç bir türdür. İstatistiksel bir hata ya da hesaplama hatası, sıklıkla karşımıza çıkar. Ancak, NaN’ın diğer sayılardan farklı bir davranışı vardır: NaN, NaN ile eşit değildir.
```javascript
let x = NaN;
console.log(x === NaN); // false
```
Çözüm:
NaN ile karşılaşıldığında, `isNaN()` fonksiyonunu kullanmak daha doğru bir yöntem olacaktır.
let x = NaN;
console.log(isNaN(x)); // true
3. Kapanmayan Döngüler
Bir geliştirici, bir döngüyü bir koşula bağladığında, bazen bitmeyecek şekilde kod yazabilir. Örneğin, "sonsuz" döngülerle karşılaşmak, JavaScript’te yaygın bir hata kaynağıdır.
```javascript
let i = 0;
while (i < 10) {
console.log(i);
// Sonsuz döngüye girebilir
}
```
Çözüm:
Döngüdeki koşulun düzgün bir şekilde güncellenip güncellenmediğini her zaman kontrol edin. Bu tip hataları önlemek için `for` döngüsü daha güvenli bir seçenek olabilir.
for (let i = 0; i < 10; i++) {
console.log(i);
}
4. Sonsuz Rekürsiyon: Call Stack Overflow
Bir fonksiyon kendisini sürekli olarak çağırarak bir stack overflow hatasına yol açabilir. Bu, JavaScript'te sıkça karşılaşılan ve tecrübeli geliştiricilerin bile bazen gözden kaçırdığı bir hata türüdür.
```javascript
function recursive() {
return recursive();
}
recursive(); // Stack overflow
```
Çözüm:
Rekürsiyon her zaman doğru bir temel durumda sonlanmalıdır. Bunu kontrol etmek için durdurma koşulları eklemek gerekir.
function recursive(count) {
if (count <= 0) return;
return recursive(count - 1);
}
recursive(10); // Doğru sonuç
5. Funkcionala Bakış: Arrow Function ve this
Arrow function ile this anahtar kelimesinin işleyişi, normal fonksiyonlardan farklıdır. Bunu anlamadan yazılan kodlarda hata yapmak çok kolaydır.
```javascript
const obj = {
name: "Test",
printName: () => {
console.log(this.name); // undefined
}
};
obj.printName();
```
Çözüm:
Arrow function'lar kendi `this` bağlamlarını miras almazlar. Eğer `this` kullanmak istiyorsanız, klasik fonksiyon kullanmalısınız.
const obj = {
name: "Test",
printName: function() {
console.log(this.name); // "Test"
}
};
obj.printName();
6. Array’siz Sayılar
Bir diziye sayıları eklerken, bir dizi beklenirken bazen sayılar tek başına tanımlanabilir. Bu hatayı genellikle yanlış veri tipi kullanımında görürüz.
```javascript
let arr = [1, 2, 3];
arr[5] = 100;
console.log(arr); // [1, 2, 3, <2 empty slots>, 100]
```
Çözüm:
Diziye veri eklerken, belirli bir indeksin mevcut olup olmadığını kontrol etmek önemlidir.
let arr = [1, 2, 3];
arr.push(100);
console.log(arr); // [1, 2, 3, 100]
7. globalThis ile Yabancı Diyarlar
JavaScript'te `globalThis` yeni eklenen bir özelliktir, ancak eski tarayıcılarda kullanılabilir olmayabilir.
```javascript
console.log(globalThis); // "globalThis" mevcut olmayabilir
```
Çözüm:
Eğer eski tarayıcı desteği gerekiyorsa, `window` veya `global` gibi eski yöntemler kullanılabilir.
console.log(window); // Tarayıcı ortamında
8. Modüllerle Değişim
ES6 modüllerini kullanırken, bazen doğru import ve export yapılandırmalarının eksik olması ciddi problemlere yol açabilir.
```javascript
import { a } from './module'; // Module not found
```
Çözüm:
Dışa aktarma işleminin doğru yapıldığından emin olun.
// module.js
export const a = 5;
9. Set ve Map: Eşleşmeyen Değerler
JavaScript’in `Set` ve `Map` veri yapıları bazen beklenmedik sonuçlar verebilir. Bu özellikle anahtar değer çiftlerinde yanlış eşleme anlamına gelir.
```javascript
let mySet = new Set();
mySet.add(5);
mySet.add(5); // Aynı değer ekleniyor!
console.log(mySet); // Set { 5 }
```
Çözüm:
Eğer `Set`’te benzersiz değerler olmasını istiyorsanız, değerlerin doğru eklenip eklenmediğini kontrol edin.
let mySet = new Set([1, 2, 3]);
mySet.add(4);
console.log(mySet); // Set {1, 2, 3, 4}
10. Asenkron Hatalar: Beklenmedik Davranışlar
Asenkron JavaScript fonksiyonları bazen beklenmedik sonuçlar verebilir. Bu hatalar genellikle `async/await` veya `setTimeout` kullanımlarında görülür.
```javascript
setTimeout(() => {
console.log("Bu bir hata değil!");
}, 0);
```
Çözüm:
Asenkron fonksiyonlarda işlem sırasının beklenmedik şekilde değişebileceğini göz önünde bulundurarak `Promise` yapıları kullanmak daha güvenli olabilir.
async function example() {
await new Promise(resolve => setTimeout(resolve, 1000));
console.log("Zamanlayıcı tamamlandı.");
}
example();