ECMAScript Referans Türleri
- Önceki sayfa ECMAScript Tür Çevirimi
- Sonraki sayfa Tekli işlem operatörleri
Referans türleri genellikle sınıf (class) olarak adlandırılır.
Bu ders, çok sayıda ECMAScript önceden tanımlanmış referans türünü tartışacaktır.
Referans türleri
Referans türleri genellikle sınıf (class) olarak adlandırılır, yani, referans değeriyle karşılaştığınızda, işletilen şey bir nesnedir.
Bu ders, çok sayıda ECMAScript önceden tanımlanmış referans türünü tartışacaktır.
Şimdiye kadar tartışılmış olan temel türlerle yakından ilgili olan referans türlerini tartışacağız.
Aşağıda tartışıldığı gibi, Boolean ifadelerinde tüm nesneler otomatik olarak true'ye dönüştürülür, bu yüzden oFalseObject'un değeri true'dur. Daha sonra true, true ile AND operasyonu gerçekleştirilir ve sonuç true'dur.Geleneksel anlamda, ECMAScript gerçekten sınıflara sahip değil. Aslında, ECMA-262'de
İpucu:Bu ders, "nesne" terimini kullanacaktır.
Nesneler, new operatörü ile ve örneklenmek istenen nesnenin adı ile oluşturulur. Örneğin, aşağıdaki kod Object nesnesinin bir örneğini oluşturur:
var o = new Object();
Bu dilbilgisi Java dilinin benzerlikleri ile, ancak birden fazla parametre olduğunda ECMAScript, parantez kullanmayı gerektirir. Parametre yoksa, aşağıdaki gibi kodda olduğu gibi parantezler atlanabilir:
var o = new Object;
Aşağıda tartışıldığı gibi, Boolean ifadelerinde tüm nesneler otomatik olarak true'ye dönüştürülür, bu yüzden oFalseObject'un değeri true'dur. Daha sonra true, true ile AND operasyonu gerçekleştirilir ve sonuç true'dur.Köşeli parantezler zorunlu değildir, ancak karışıklığı önlemek için kullanmak en iyisidir.
İpucu:Nesneler ve davranışları hakkında daha derinlemesine bilgi edinmek için nesne temel konularında daha fazla araştırma yapacağız.
Bu bölümün odak noktası, eşdeğer başlangıç türlerine sahip referans türleridir.
Object nesnesi
Object nesnesi, diğer sınıfları anlamadan önce az bir öneme sahiptir, ancak diğer sınıfları anlamak için önce anlaşılması gereken bir konudur. Çünkü ECMAScript'teki Object nesnesi, Java'daki java.lang.Object ile benzerdir, ECMAScript'teki tüm nesneler bu nesne tarafından miras alınır, Object nesnesindeki tüm özellikler ve yöntemler diğer nesnelerde de görünür, bu yüzden Object nesnesini anladıktan sonra diğer nesneleri daha iyi anlayabilirsiniz.
Object nesnesi aşağıdaki özelliklere sahiptir:
- constructor
- Nesneyi oluşturan fonksiyona olan referans (işaretçi). Object nesnesi için, bu işaretçi temel Object() fonksiyonuna işaret eder.
- Prototype
- Bu nesnenin nesne prototipine olan referansı. Tüm nesneler için, bu varsayılan olarak Object nesnesinin bir örneğini döndürür.
Object nesnesi, birkaç yöntem daha içerir:
- hasOwnProperty(property)
- Nesnenin belirli bir özelliğe sahip olup olmadığını kontrol eder. Bu özellik, string olarak belirtilmelidir. (örneğin, o.hasOwnProperty("name"))
- IsPrototypeOf(object)
- Bu nesnenin bir başka nesnenin prototipi olup olmadığını kontrol eder.
- PropertyIsEnumerable
- Verilen özelliğin for...in ifadesi ile sayılabilir olup olmadığını kontrol eder.
- ToString()
- Nesnenin başlangıç dize temsilini döndürür. Object nesnesi için, ECMA-262 bu değeri tanımlamamıştır, bu yüzden farklı ECMAScript gerçeklemeleri farklı değerler sunar.
- ValueOf()
- Bu对象的 en uygun başlangıç değeri döndürür. Birçok nesne için, bu yöntem döndürdüğü değer ToString() yönteminin döndürdüğü değere eşittir.
Açıklama:Yukarıda listelenen her türlü özellik ve yöntem, diğer nesneler tarafından geçersiz kılmaktadır.
Boolean nesnesi
Boolean nesnesi Boolean temel türünün referans türüdür.
Boolean nesnesi oluşturmak için sadece Boolean değeri parametre olarak geçirilir:
var oBooleanObject = new Boolean(true);
Boolean nesnesi Object nesnesinin ValueOf() yöntemini geçersiz kılar ve temel değeri, yani true ve false döndürür. ToString() yöntemi de geçersiz kılar ve "true" veya "false" döndürür.
Maalesef, ECMAScript'te Boolean nesnesi az kullanılır ve kullanılsa bile anlaşılması zor olabilir.
Sorunlar genellikle Boolean nesnesinin Boolean ifadelerinde kullanıldığında ortaya çıkar. Örneğin:
Boolean nesnesi oluşturmak için sadece Boolean değeri parametre olarak geçirilir: var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true; // Çıktı: true
Bu kod parçasında, false değeriyle Boolean nesnesi oluşturulur. Daha sonra bu değer, temel değer true ile AND operasyonu gerçekleştirilir. Boolean hesaplamalarında, false ve true'nun AND operasyonu sonucu false'dur. Ancak, bu satırda hesaplanan oFalseObject, değil onun değeri false'dır.
Aşağıda tartışıldığı gibi, Boolean ifadelerinde tüm nesneler otomatik olarak true'ye dönüştürülür, bu yüzden oFalseObject'un değeri true'dur. Daha sonra true, true ile AND operasyonu gerçekleştirilir ve sonuç true'dur.Dikkat:
Görünüm
Boolean nesnesinin kullanılabilirliğini anlamalısınız, ancak bu bölümde bahsedilen sorunları önlemek için Boolean temel değerlerini kullanmak en iyisidir. JavaScript Boolean nesnesi referans el kitabı.
Boolean nesnesi hakkında daha fazla bilgi için
Number nesnesi
var oNumberObject = new Number(68);
Bu bölümün önceki bölümlerinde tartışıldığı gibi, Number nesnesi Number temel türünün referans türüdür. Number nesnesi oluşturmak için aşağıdaki kodu kullanın:
Sayısal nesnenin Number temel değerini elde etmek için valueOf() yöntemini kullanmanız yeterlidir:
var iNumber = oNumberObject.valueOf();
Elbette, Number sınıfı da toString() yöntemine sahiptir, bu yöntem, tür dönüşümü bölümünde detaylı olarak tartışılmıştır.
Object nesnesinden miras alınan standart yöntemlerin yanı sıra, Number nesnesi birkaç sayıyı işleyen özel yöntemlere sahiptir.
toFixed() yöntemi
toFixed() yöntemi, belirli sayıda ondalık basamağa sahip sayının string temsilini döndürür. Örneğin:
var oNumberObject = new Number(68); alert(oNumberObject.toFixed(2)); // çıktı "68.00"
Burada, toFixed() yönteminin parametresi 2'dir, bu da iki ondalık basamağı gösterir. Bu yöntem, boş string yerlerini 0 ile doldurarak "68.00" döndürür. Para işleme uygulamaları için çok faydalı olan bu yöntem, 0 ila 20 basamak arasındaki sayıları temsil edebilir, bu aralık dışındaki değerler hata çıkarır.
toExponential() yöntemi
Formatlamakle ilgili bir diğer yöntem de toExponential() yöntemidir, bu yöntem, sayının bilimsel sayı sistemiyle temsil edilen string形式ını döndürür.
toFixed() yöntemine benzer, toExponential() yöntemi de bir parametreye sahiptir, bu da çıktıdan çıkarılacak ondalık basamak sayısını belirtir. Örneğin:
var oNumberObject = new Number(68); alert(oNumberObject.toExponential(1)); // çıktı "6.8e+1"
Bu kodun sonucu "6.8e+1" olacaktır, daha önce açıkladığım gibi, bu 6.8x10'u temsil eder.1Sorun, hangi formatta (önceden belirlenmiş forma veya üslü forma) sayıyı temsil etmem gerekiyorsa nedir? toPrecision() yöntemini kullanabilirsiniz.
toPrecision() yöntemi
toPrecision() yöntemi, sayının önceden belirlenmiş biçimini veya üslü formunu döndürür. Bir parametresi vardır, bu da sayının temsil edilecek sayı sayısıdır (üslü form dışında). Örneğin,
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(1)); // çıktı "7e+1"
Bu kodun görevi, sayı 68'yi bir basamakla temsil etmektir, sonuç "7e+1" olacaktır, başka bir şekilde ifade edilirse 70. Gerçekten de, toPrecision() yöntemi sayıları yuvarlar. Ancak, 68'yi 2 basamakla temsil etmek çok daha kolay olur:
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(2)); // çıktı "68"
Elbette, çıktı "68" çünkü bu sayının doğru temsilidir. Ancak, belirlenen basamak sayısı gerekli olan sayıdan fazla olursa ne olur?
var oNumberObject = new Number(68); alert(oNumberObject.toPrecision(3)); // çıktı "68.0"
Bu durumda, toPrecision(3) toFixed(1) ile eşdeğerdir ve "68.0" çıktısı verir.
toFixed(), toExponential() ve toPrecision() yöntemleri, doğru ondalık basamak sayısını doğru bir şekilde temsil etmek için yuvarlama işlemleri yapar.
İpucu:Boolean nesnesi ile benzer şekilde, Number nesnesi de önemlidir, ancak bu tür nesneleri mümkün olduğunca az kullanmalısınız. Potansiyel sorunları önlemek için mümkün olduğunca sayısal temel ifadeyi kullanın.
Görünüm
Number nesnesi hakkında daha fazla bilgi almak için JavaScript Number nesnesi referans el kitabı.
String nesnesi
String nesnesi, String temel türünün nesne temsilcisidir, aşağıdaki gibi oluşturulur:
var oStringObject = new String("hello world");
String nesnesinin valueOf() ve toString() yöntemleri, String türünün temel değerlerini döndürür:
alert(oStringObject.valueOf() == oStringObject.toString()); // çıktı "true"
Bu kodu çalıştırdığınızda çıkan sonuç "true"dir, bu da bu değerlerin gerçekten eşit olduğunu gösterir.
Açıklama:String nesnesi, ECMAScript'te daha karmaşık referans türlerinden biri. Aynı şekilde, bu bölümün odak noktası sadece String sınıfının temel işlevleridir. Daha ileri düzeydeki işlevler için bu eğitimdeki ilgili bölümleri okuyun veya JavaScript String nesnesi referans el kitabı.
length özelliği
String nesnesi, dizi içindeki karakter sayısını içeren length özelliğine sahiptir:
var oStringObject = new String("hello world"); alert(oStringObject.length); // çıktı "11"
Bu örnekte çıkan sonuç "11"dir, yani "hello world" dizesindeki karakter sayısı. Dikkat edin, dizi çift bayt karakterler içerse bile (ASCII karakterleri ile karşılaştırıldığında, ASCII karakterleri sadece bir bayt alır), her karakter sadece bir karakter sayılır.
charAt() ve charCodeAt() yöntemleri
String nesnesi, birçok yönteme sahiptir.
Öncelikle, charAt() ve charCodeAt() yöntemleri, dizi içindeki tek bir karakteri erişir. Bu iki yöntem de bir parametreye sahiptir, bu da işlem yapılacak karakterin konumudur.
charAt() yöntemi, belirtilen konumdaki karakteri içeren bir dizi döndürür:
var oStringObject = new String("hello world"); alert(oStringObject.charAt(1)); // çıktı "e"
Dizge "merhaba dünya" içinde, konum 1'deki karakter "e". "ECMAScript Temel Türleri" bölümünde belirttiğimiz gibi, ilk karakterin konumu 0, ikinci karakterin konumu 1, vb. Bu nedenle, charAt(1) çağrısı "e" döndürür.
Eğer karakter kodunu değil karakteri elde etmek istiyorsanız, charCodeAt() yöntemini çağırabilirsiniz:
var oStringObject = new String("hello world"); alert(oStringObject.charCodeAt(1)); // "101" çıktısı
Bu örnek "101" çıktısı verir, yani küçük harf "e" karakter kodu.
concat() yöntemi
Şimdi concat() yöntemine gelelim, bu yöntem, bir veya daha fazla dizgeyi String nesnesinin ana değerine eklemek için kullanılır. Bu yöntem, String ana değerini döndürür ve orijinal String nesnesini değiştirmez:
var oStringObject = new String("merhaba "); var sResult = oStringObject.concat("dünya"); alert(sResult); // "merhaba dünya" çıktısı alert(oStringObject); // "merhaba " çıktısı
Bu kod parçasında, concat() yöntemi "merhaba dünya" döndürür, oysa String nesnesi "merhaba " hala durur. Bu nedenle, genellikle eklemek için artı işareti (+) kullanılır, çünkü bu form, gerçek davranışı mantıklı bir şekilde gösterir:
var oStringObject = new String("merhaba "); var sResult = oStringObject + "dünya"; alert(sResult); // "merhaba dünya" çıktısı alert(oStringObject); // "merhaba " çıktısı
indexOf() ve lastIndexOf() yöntemleri
Bugüne kadar, dizge birleştirme yöntemleri ve dizgedeki tekil karakterlere erişim yöntemleri hakkında konuşulmuştur. Ancak, bir dizgede belirli bir karakterin gerçekten olup olmadığını belirlemek mümkün değilse, hangi yöntemi çağırmanız gerektiğini biliyor musunuz? Bu durumda, indexOf() ve lastIndexOf() yöntemlerini çağırabilirsiniz.
indexOf() ve lastIndexOf() yöntemleri, belirtilen alt dizgenin bir başka dizgedeki konumunu döndürür. Alt dizge bulunamazsa, -1 döndürür.
Bu iki yöntemin farkı, indexOf() yönteminin dizge başından (konum 0) başlayarak dizgeyi araması, oysa lastIndexOf() yönteminin dizge sonundan başlayarak alt dizgeyi aramasıdır. Örneğin:
var oStringObject = new String("merhaba dünya!"); alert(oStringObject.indexOf("o")); 输出 "4" alert(oStringObject.lastIndexOf("o")); 输出 "7"
Burada, ilk "o" dizgesi 4. konumda出现位置出现,yani "hello" içindeki "o"; son "o" 7. konumda出现位置出现,yani "world" içindeki "o". Eğer dizgede sadece bir "o" dizgesi varsa, indexOf() ve lastIndexOf() yöntemleri dönen konumlar aynıdır.
localeCompare() yöntemi
Bir sonraki yöntem localeCompare()'dur, dizgeleri sıralamak için. Bu yöntemde bir parametre vardır - karşılaştırılacak dizge, döndürülen değer aşağıdaki üç değerden biri olacaktır:
- String nesnesi parametredeki dizge öncesinde harf sırasına göre yer alırsa, negatif bir değer döndürür.
- String nesnesi parametredeki dizgeye eşitse, 0 döndürür.
- String nesnesi parametredeki dizge sonrası harf sırasına göre yer alırsa, pozitif bir değer döndürür.
Açıklama:Eğer dönen değer negatifse, en yaygın olanı -1'dir, ancak gerçekten dönen değer implementasyona bağlıdır. Eğer dönen değer pozitifse, aynı şekilde, en yaygın olanı 1'dir, ancak gerçekten dönen değer implementasyona bağlıdır.
Aşağıdaki gibi bir örnek:
var oStringObject = new String("yellow"); alert(oStringObject.localeCompare("brick")); // çıktı "1" alert(oStringObject.localeCompare("yellow")); // çıktı "0" alert(oStringObject.localeCompare("zoo")); // çıktı "-1"
Bu kod parçasında, "yellow" dizgesi 3 değere karşılaştırıldı, yani "brick", "yellow" ve "zoo". Harf sırasına göre sıralandığı için, "yellow" "brick" sonrası yer alır, bu yüzden localeCompare() 1 döndürür; "yellow" "yellow" ile eşittir, bu yüzden localeCompare() 0 döndürür; "zoo" "yellow" sonrası yer alır, localeCompare() -1 döndürür. Tekrar vurgulayayım ki, döndürülen değer implementasyona bağlı olduğundan, localeCompare() yöntemini aşağıdaki gibi çağırmanın en iyisi:
var oStringObject1 = new String("yellow"); var oStringObject2 = new String("brick"); var iResult = oStringObject1.localeCompare(oStringObject2); if(iResult < 0) { alert(oStringObject1 + " önce gelir " + oStringObject2); } alert(oStringObject1 + " sonra gelir " + oStringObject2); } alert("İki string eşittir"); }
Bu yapıyı kullanarak, bu kodun tüm uygulamalarda doğru çalışacağını sağlayabilirsiniz.
localeCompare() yönteminin özgün özelliği, çalıştığı bölge (locale, hem ülke/ bölge hem de dil) bu yöntemin nasıl çalıştığını kesin bir şekilde belirtmektedir. Amerika'da, ECMAScript uygulamasının standart dili İngilizce'dir, localeCompare() büyük/küçük harf duyarlıdır ve büyük harfler küçük harflerden sonra dizgi sırasında gelir. Ancak, diğer bölgelerde bu durum böyle olmayabilir.
slice() ve substring()
ECMAScript, slice() ve substring() yöntemleri gibi iki yöntem sunar, bu da alt dizge oluşturmak için string değerler. Bu iki yöntem de işlenen stringin alt dizgesini döndürür ve bir veya iki parametreyi alır. İlk parametre, alınacak alt dizgenin başlangıç konumu, ikinci parametre (kullanılırsa) ise alt dizgenin sonlandırılacağı konum (yani, sonlandırma konumundaki karakter, döndürülen değer içermemektedir). İkinci parametreyi atarsanız, sonlandırma konumu stringin uzunluğu olarak varsayılır.
concat() yöntemi gibi, slice() ve substring() yöntemleri de String nesnesinin kendi değerini değiştirmez. Sadece orijinal String değerini döndürür ve String nesnesini değiştirmez.
var oStringObject = new String("hello world"); alert(oStringObject.slice("3")); // Çıktı "lo world" alert(oStringObject.substring("3")); // Çıktı "lo world" alert(oStringObject.slice("3", "7")); // Çıktı "lo w" alert(oStringObject.substring("3", "7")); // Çıktı "lo w"
Bu örnekte, slice() ve substring() kullanımları aynı ve döndürdükleri değerler de aynıdır. Parametre sadece 3 olduğunda, her iki yöntem de "lo world" döner, çünkü "hello" ifadesindeki ikinci "l" karakteri 3. konumdadır. İki parametre "3" ve "7" olduğunda, her iki yöntem de "lo w" döner ("world" ifadesindeki "o" karakteri 7. konumdadır, bu yüzden sonuçta dahil değildir).
Neden iki tamamen aynı işlev gören yöntem var? Aslında, bu iki yöntem tamamen aynı değil, sadece negatif parametreler için parametreleri işlemek şekillerinde biraz farklılık gösterir.
Negatif parametreler için, slice() yöntemi dizginin uzunluğuna parametreyi ekler, substring() yöntemi ise onu 0 olarak işler (yani göz ardı eder). Örneğin:
var oStringObject = new String("hello world"); alert(oStringObject.slice("-3")); // Çıktı "rld" alert(oStringObject.substring("-3")); // Çıktı "hello world" alert(oStringObject.slice("3, -4")); // Çıktı "lo w" alert(oStringObject.substring("3, -4")); // Çıktı "hel"
Bu şekilde slice() ve substring() yöntemlerinin temel farkını görebilirsiniz.
Sadece -3 parametresi varsa, slice() fonksiyonu "rld" döner, substring() ise "hello world" döner. Bu, "hello world" dizgisinde slice("-3") fonksiyonunun slice("8") olarak dönüştürülmesi ve substring("-3") fonksiyonunun substring("0") olarak dönüştürülmesi nedeniyle olur.
Aynı şekilde, parametre 3 ve -4 kullanıldığında, fark da oldukça açıktır. slice() parametre olarak 3, 7 olarak dönüştürülür ve önceki örnekte olduğu gibi, "lo w" döner. substring() ise iki parametreyi substring(3, 0) olarak yorumlar, yani substring(0, 3), çünkü substring() her zaman küçük olan numarayı başlangıç olarak, büyük olan numarayı bitiş olarak kullanır. Bu yüzden, substring("3, -4") "hel" döner. Buradaki son satır kodu bu yöntemlerin nasıl kullanılacağını göstermek içindir.
toLowerCase(), toLocaleLowerCase(), toUpperCase() ve toLocaleUpperCase()
Son olarak, büyük-küçük harf dönüşümüne ilişkin yöntemleri ele alalım. Büyük-küçük harf dönüşümü gerçekleştirmek için 4 yöntem kullanılır:
- toLowerCase()
- toLocaleLowerCase()
- toUpperCase()
- toLocaleUpperCase()
İsimlerinden anlaşılacağı gibi, bu yöntemlerin kullanımı, string'i tam küçük harfe veya tam büyük harfe dönüştürmektir. İlk iki yöntem string'i tam küçük harfe dönüştürmek için kullanılır, sonraki iki yöntem ise string'i tam büyük harfe dönüştürmek için kullanılır.
toLowerCase() ve toUpperCase() yöntemleri temel, java.lang.String içindeki aynı yöntemlerin prototipi olarak uygulanmıştır.
toLocaleLowerCase() ve toLocaleUpperCase() yöntemleri belirli bir bölgeye dayalıdır (localeCompare() yöntemi ile aynıdır). Birçok bölgede, bölgeye özgü yöntemler genel yöntemlerle tamamen aynıdır. Ancak, bazı diller Unicode büyük-küçük harf dönüşümüne özel kurallara sahiptir (örneğin, Türkçe), bu yüzden doğru dönüşüm için bölgeye özgü yöntemlerin kullanılması gerekir.
var oStringObject = new String("Hello World"); alert(oStringObject.toLocaleUpperCase()); // Çıktı "HELLO WORLD" alert(oStringObject.toUpperCase()); // Çıktı "HELLO WORLD" alert(oStringObject.toLocaleLowerCase()); // Çıktı "hello world" alert(oStringObject.toLowerCase()); // Çıktı "hello world"
Bu kodda, toUpperCase() ve toLocaleUpperCase() çıktısı "HELLO WORLD", toLowerCase() ve toLocaleLowerCase() çıktısı "hello world". Genel olarak, bir dilin hangi kodlama ile çalıştığını bilmediğinizde, bölgeye özgü yöntemlerin güvenli olduğunu kullanmak daha güvenlidir.
İpucu:Unutmayın, String nesnesinin tüm özellikleri ve yöntemleri, onlar sahte nesneler oldukları için String temel değerlerine uygulanabilir.
instanceof işlev operatörü
typeof işlev operatörü ile referans türünde değerler saklandığında bir sorun ortaya çıkar, ne tür bir nesne olursa olsun, "object" döner. ECMAScript, bu sorunu çözmek için bir diğer Java işlev operatörü olan instanceof'ı tanıttı.
instanceof işlev operatörü typeof işlev operatörüne benzer, işlemde olan nesnenin türünü tanımlamak için kullanılır. typeof yönteminden farklı olarak, instanceof yöntemi geliştiricinin belirli bir türü doğrulamasını gerektirir. Örneğin:
var oStringObject = new String("hello world"); alert(oStringObject instanceof String); // Çıktı "true"
Bu kod, "değişken oStringObject String nesnesinin bir örneği mi?" sorusunu soruyor. oStringObject gerçekten String nesnesinin bir örneğidir, bu yüzden sonuç "true". typeof yöntemi kadar esnek olmamakla birlikte, typeof yöntemi "object" döndüğünde instanceof yöntemi hala oldukça kullanışlıdır.
- Önceki sayfa ECMAScript Tür Çevirimi
- Sonraki sayfa Tekli işlem operatörleri