22 Kasım 2021

İlkel Tiplerin Metodları

JavaScript ilkel tiplerin(karakter dizisi, sayılar vs.) karakter gibi kullanılmasına olanak verir.

Ayrıca bunların metodlarının çağırılabilmesini sağlar. Az sonra da gösterileceği gibi, aslında bu ilkel tipler obje değillerdir. (İlerleyen zamanlarda bu daha açık bir şekilde görülecektir.)

İlkel tipler ile objeler arasındaki farka bakılacak olursa:

İlkel tip:

  • 7 tane ilkel tip vardır: string, number, bigint, boolean, symbol, null ve undefined.

Obje:

  • Birçok değeri özellikleri içerisinde saklayabilir.
  • {} şeklinde, örneğin {isim:"Kemal", yas:30} gibi. JavaScript’te fonksiyonlar gibi başka türde de objeler bulunmaktadır.

Objeler için ön önemli özelliklerden birisi de fonksiyonları özellikleri içerisinde tutabilmeleridir:

let kemal = {
  isim: "Kemal",
  selamVer: function() {
    alert("Selam Dostum!");
  }
};

kemal.selamVer(); // Selam Dostum!

kemal isminde bir obje ve selamVer adında bir metod yukarıdaki gibi tanımlanabilir.

Çoğu var olan objeler, tarih, hatalar, HTML elementleri kendine has metodlara sahiptirler.

Tabi bu farklılığın bir maliyeti var!

Objeler ilkellere göre daha “ağırdırlar”. Daha fazla kaynak gerektirirler. Fakat özellikler ve metodlar çok önemli olduklarından JavaScript motoru bunları olabildiğince optimize eder.

Obje olarak ilkel tipler

Burada JavaScript’i oluşturan kişiler ikilem ile karşılaşmışlardır:

  • Karakter dizisi veya sayı gibi ilkel tipler ile birçok şey yapılmak istenebilir. Bunlara metod eklenmesine izin vermek harika olur.
  • İlkel tipler olabildiğince hızlı olmalıdır.

Çözüm biraz garip :

  1. İlkel tipler hala ilkel tip olarak kalacak. Tek bir değer istendiği gibi atanabilecek.
  2. Karakter dizisi, sayı, boolean ve sembollerin metodlarına izin verilecek.
  3. Bu yapıldığı yani bu metodlara erişilmeye çalışıldığında özel bir “obje kabı” yaratılacak ve bunun içinde farklı fonksiyonalite eklenebilecek veya silinebilecek.

“Obje Kapları”(Object wrappers) her ilkel tip için farklıdır bunlar: String, Number, Boolean ve Symbol şeklindedir. Hepsinin kendine has metodları vardır.

Örneğin str.toUpperCase() bir stringdeki karakterlerin hepsini büyük harfe çevirir.

Çalışması şu şekilde:

let str = "Merhaba";

alert( str.toUpperCase() ); // MERHABA

Basit değil mi? str.toUpperCase() çağırıldığında sırası ile aşağıdakiler olmaktadır.

  1. Karakter dizisi str ilkel bir tiptir. Bundan dolayı özelliğine erişilmek istendiğinde aynı karakter dizisine sahip bir obje yaratılır. Bu objenin toUpperCase() gibi kullanışlı metodları bulunmaktadır.
  2. Bu metod yeni bir karakter dizisi döndürür ve bu alert içinde gösterilir.
  3. Özel yaratılan obje imha edilir, str eski ilkel haline döner.

Yani ilkel tipler metodları sağlamış olur fakat yine de “hafif” bir şekilde varlığını sürdürür.

JavaScript motoru bu işlemleri en uygun hale getirmektedir. Belki ekstra bir objenin yaratılmasını tamamen pas geçebilir. Fakat yine de sanki yaratılmış gibi davranması gerekmektedir.

Sayılar da kendine has metodlara sahiptir. Örneğin toFixed(n) sayıyı yuvarlamaya yarar:

let n = 1.23456;

alert( n.toFixed(2) ); // 1.23

Sayılar ve Karakter Dizisi - Strings bölümlerinde daha fazla metod işlenecektir…

String/Number/Boolean gibi yapıcılar sadece içte kullanım içindir

Java gibi bazı diller bu obje kapsayıcıları doğrudan tanımlamanıza izin verir. Örneğin new Number(1) veya new Boolean(false) gibi

JavaScript’te de bu eskiden kalma özelliklerden dolayı mümkündür, fakat önerilmez. Bir örnek verilecek olursa:

alert( typeof 1 ); // "number"

alert( typeof new Number(1) ); // "object"!

sifir karşılaştırmalarında sorunla yaratabilir:

let sifir = new Number(0);

if (sifir) { // burada sıfır true gelecek çünkü o bir obje
  alert( "Sıfır doğru mu??? );
}

Diğer bir yandan new olmadan String/Number/Boolean kullanılması ise tamamen mantıklıdır. Değeri belirtilen ilkel tipe çevirmeye yarar.

Örneğin:

let num = Number("123"); // karakteri sayıya çevir.
null/undefined’ın metodları yoktur.

null ve undifined’ın “obje kabı” yoktur. Bundan dolayı metodları bulunmaz. Böyle baklıdığında bunlara “en ilkel tip” denebilir.

Böyle bir değişkenin özelliğine erişmeye çalışmak hata dödürür:

alert(null.test); // hata

Özet

  • null ve undefined haricindeki ilkel tipler işe yarar metodların kullanılmasına izin verir.
  • Şeklen, bu metodlar geçici objelerle çalışır, fakat JavaScript motorları çok etkin bir şekilde çalıştıklarından bu çağrılar masraflı değildir.

Görevler

önem: 5

Aşağıdaki koda göre:

let str = "Merhaba";

str.test = 5;

alert(str.test);

Çalışır mı? Çalışırsa ekranda ne gösterilir?

Çalıştırmayı deneyin:

let str = "Merhaba";

str.test = 5; // (*)

alert(str.test);

İki türlü cevap verilebilir:

  1. undefined
  2. Hata

Neden? Ne olduğuna (*) satırından bakarsanız:

  1. str nin bir özelliğine erişildiğinde, “obje kabı” yaratılır.
  2. Bundan dolayı obje test özelliğini alır.
  3. “obje kabı” kaybolur ve işlem tamamlanır.

Öyleyse str nin son satırında özelliğe ait hiçbir iz yoktur. İlkel tipin üzerinde yapılan değişiklik için yeni obje kabı üretilir.

Bazı tarayıcılar ilkel tiplere yeni özellik tanımlanmasına izin vermezler. Bundan dolayı (*) bölümünde undefined değil de hata da görebilirsiniz. Bu aslında özelliklerin dışında bir uygulamadır.

Bu örnekten de gördüğünüz gibi ilkel tipler kesinlikle obje değillerdir.

Geçici metodlar oluşturarak obje gibi davranırlar. Yukarıdaki örnekte olduğu gibi bunları fazla tutamazlar.

Eğitim haritası