Makkalot's Place

A polyglot programmer

Javascript Acayiplikleri - Tip Çevrimleri

| Comments

Javascript’in en kafa karıştırıcı ve acayip özelliklerinden bir tanesi tip çevirimleri konusu. “Javascript : Definitive Guide” kitabını okurken “==” karşılatırma operatörü söz konusu olduğunda, eğer karşılaştırılan objeler aynı tipten değilse birtakım tip çevirimleri yapılıyor. Bu javascript dizayn edildiği yıllarda geliştiricilere kolaylık olsun diye yapılmış bir özellik Fakat kolaylıktan çok, bence baş ağrıtan bir özellik olmuş. Gerek var mı tip çevrimlerine ? Bence yok, bu şekilde çalışan bi sürü dil var ve hiçbir zaman tip çevriminin ihtiyacını duymadım. Peki neden

1
2
true == 1
true

cevabı dönüyor? İlk bakıldığında çok saçma gelse de, bu saçmalığı yaratan bir dizi kurallar var :

  • Eğer karşılaştırılan tipler aynı ise bire bir karşılaştırılma yapılır(string, number vs). Diğer diller öntanımlı olarak sadece bunu yapıyor.
  • Eğer tipler farklı ise :
  • Eğer biri “null” diğeri “undefined” is true
  • Eğer ikisi de true true is true, false false is false’dir(doğal olarak)
  • Eğer değerlerden biri NaN ise false döner
  • Eğer biri string diğeri number ise, string number’a çevrilip deneme yapılır.
  • Eğer biri true is 1’e, false ise 0’a çevrilip kontrol o şekilde yapılır.
  • Eğer biri object ise önce daha basit bir tipe dönüşüm yapılır. Önce varsa valueOf fonksyonu çağrılır, ondan dönen değer basit ise onunla kontrol yapılır. Eğer valueOf yoksa, toString fonksyonu çağırılır ve ondan dönen string değeri kullanılır.

Bu durumda

1
2
"1" == true
true

ifadesinde true, önce 1’e çevrilir :

1
"1" == 1

durumuna geldikten sonra, “1”‘de number’a çevrilir ve :

1
1 == 1

olur, bu duurmda da istenen cevap ortaya çıkar. Bu tür bir tip dönüştürme işlemi <, <=, >, >= operatörlerinde de geçerli oluyor.

Bu karşılaştırma işlemlerinde string ve number kalınca, hepsi number yapılmaya çalışılıyor. + ve * operatörlerinde ise sonuç genelde string odaklı oluyor.

1
2
"1" + 2
"12"

Artık bu tür ifadeleri gördüğümde şaşırmayacağım :

1
2
3
4
1 + {}
"1[object Object]"
true + true
2

Peki gerek var mı ? Bence kafa karıştırması dışında bir faydası yok. Bunun gibi acayip kuralları akılda tutmak istemiyorsanız === operatörünü kullanabilirsiniz. Bu operatör ==‘ın aksine tip dönüşümü yapmıyor, yani diğer dillerdeki gibi çalışıyor ki, bu durumda bu çok güzel birşey.

Comments