czay.dev
Yazılar

JavaScript'te `==` Tuzağı ve Type Coercion

`"" == 0` neden true? `[] == false` neden true? Ancak `NaN == NaN` neden false? JavaScript'in en çok kafa karıştıran type coercion (tip dönüşümü) mekanizmasını ve bu kargaşadan kurtulmanın tek kesin yolunu inceliyoruz.

Furkan Özay17 Eylül 2026 · 2 dk okuma
JavaScript'te `==` Tuzağı ve Type Coercion

Üç satırlık basit bir kod düşünün: Boş string sıfıra eşit mi ("" == 0)? Boş dizi false'a eşit mi ([] == false)? Peki, NaN kendine eşit mi (NaN == NaN)?

JavaScript'te bu soruları == (iki eşittir) operatörü ile sorduğunuzda ilk ikisinin cevabı true, sonuncusunun cevabı ise false döner. Üstelik boş string sıfıra eşit olmasına rağmen, sıfır stringi ("0") boş stringe ("") eşit değildir. Peki null sıfıra eşit mi (null == 0)? Hayır. Ama null >= 0 yazdığınızda sonuç true döner.

Bu sonuçlar ilk bakışta tamamen rastgele ve hatalı görünebilir, ancak aslında hiçbir şey rastgele değildir. Hepsinin yazılı bir kuralı var.

Algoritma ve Type Coercion

Bu garipliklerin arkasındaki mekanizmanın adı Type Coercion (Zorunlu Tip Dönüşümü). JavaScript'te == kullandığınızda, iki tarafın tipleri farklıysa dil bunları aynı tipe getirmek için birtakım dönüşümler yapar.

Örneğin [] == false ifadesinde:

  • false önce sayıya döner ve 0 olur. ([] == 0)
  • Boş dizi ([]) ilkel değere (primitive) çevrilir, bu da boş bir string demektir (""). ("" == 0)
  • Boş string de sayıya çevrildiğinde 0 olur.
  • Sonuç olarak 0 == 0 karşılaştırması yapılır ve bu da true döner.

Tek istisna null değeridir. İki eşittir (==) için null, yalnızca undefined'a eşittir, sayıya çevrilmez. Ancak >= (büyük eşittir) gibi ilişkisel operatörler böyle bir istisna tanımaz ve null'ı sıfır yapar. Yani null == 0 eşit değildir, ama null >= 0 büyük eşittir!

Kural ve Çözüm

Bütün bu dönüşüm adımlarını ve kuralları ezberlemek zorunda değilsiniz. Çözüm tek bir satır ve tek bir kuraldır: Her yerde üç eşittir (===) kullanın.

Üç eşittir (===) operatörü, Strict Equality (Sıkı Eşitlik) anlamına gelir. Karşılaştırma yaparken asla tip çevirmez (type coercion uygulamaz). Eğer iki tarafın tipleri farklıysa, hiçbir çeviri yapmadan anında false döndürür.

Tek bir istisna vardır: null ve undefined değerlerini birlikte yakalamak istediğinizde deger == null yazabilirsiniz. Bunun dışında her yerde === kullanmak sizi bu karmaşadan kurtarır.

Kapanış

Ekibinizde "Neden böyle çalıştı?" tartışmalarını bitirmek istiyorsanız, projenize bir ESLint kuralı olan eqeqeq kuralını ekleyin. Böylece kod tabanında yanlışlıkla iki eşittir kullanılmasını tamamen engellemiş olursunuz.