Tipe Referensi ECMAScript

Tipe referensi biasanya disebut kelas (class).

Panduan ini akan mendiskusikan berbagai tipe referensi yang di-definiskan ECMAScript.

Tipe referensi

Tipe referensi biasanya disebut kelas (class), yang artinya, ketika menangani nilai referensi, yang ditangani adalah objek.

Panduan ini akan mendiskusikan berbagai tipe referensi yang di-definiskan ECMAScript.

Dari sekarang ini, akan disebutkan tentang tipe referensi yang erat hubungannya dengan tipe asli yang telah disebutkan.

Perhatian:Dalam arti tradisional, ECMAScript tidak benar-benar memiliki kelas. Faktanya, selain menunjukkan bahwa kelas tidak ada, kata 'kelas' sama sekali tidak muncul di ECMA-262. ECMAScript mendefinisikan 'definisi objek', secara logis setara dengan kelas di bahasa pemrograman lain.

Petunjuk:Panduan ini akan menggunakan istilah "objek".

Objek dibuat dengan menggunakan operator new dengan nama objek yang akan diinstansiasi. Contoh, kode di bawah ini menciptakan instance objek Object:

var o = new Object();

Sintaks ini mirip dengan bahasa Java, tetapi saat ada lebih dari satu parameter, ECMAScript meminta untuk menggunakan kurung kurawal. Jika tidak ada parameter, seperti kode di bawah ini, kurung kurawal dapat dilewati:

var o = new Object;

Perhatian:Walaupun kurung kurawal bukan wajib, namun untuk menghindari kebingungan, lebih baik menggunakan kurung kurawal.

Petunjuk:Kami akan mendalami lebih mendalam tentang objek dan perilaku mereka di bab dasar objek.

Fokus bagian ini adalah tipe referensi yang memiliki tipe asli yang sama.

Objek Object

Objek Object sendiri tidak berguna terlalu banyak, tetapi sebelum mengerti kelas lain, masih harus mengerti ini. Karena objek Object di ECMAScript mirip dengan java.lang.Object di Java, semua objek di ECMAScript mengambil turunan dari objek ini, semua properti dan metode di dalam objek Object akan muncul di objek lain, jadi mengerti objek Object akan membuat pengertian tentang objek lain menjadi lebih baik.

Objek Object memiliki properti berikut:

constructor
Referensi (pointer) ke fungsi yang membuat objek. Untuk objek Object, pointer ini mengarah ke fungsi Object() asli.
Prototype
Referensi ke prototipe objek ini. Untuk semua objek, ini secara default mengembalikan instance dari Object.

Objek Object juga memiliki beberapa metode:

hasOwnProperty(property)
Menentukan apakah objek memiliki properti khusus. Harus menggunakan string untuk menentukan properti ini. (Contoh, o.hasOwnProperty("name"))
IsPrototypeOf(object)
Menentukan apakah objek ini adalah prototipe dari objek lain.
PropertyIsEnumerable
Menentukan apakah properti yang diberikan dapat diekspor melalui pernyataan for...in.
ToString()
Kembalikan ekspresi string asli dari objek. Untuk objek Object, ECMA-262 tidak menentukan nilai ini, jadi nilai yang berbeda dapat ditemukan di implementasi ECMAScript yang berbeda.
ValueOf()
Kembalikan nilai asli yang paling sesuai untuk objek yang diberikan. Untuk banyak objek, nilai yang dikembalikan oleh metode ini sama dengan nilai yang dikembalikan oleh ToString().

Keterangan:Setiap properti dan metode yang terdaftar di atas akan ditimpa oleh objek lain.

Objek Boolean

Objek Boolean adalah tipe referensi untuk tipe asli Boolean.

Untuk membuat objek Boolean, cukup kirim nilai Boolean sebagai parameter:

var oBooleanObject = new Boolean(true);

Objek Boolean akan menimpa metode ValueOf() objek Object, mengembalikan nilai asli, yaitu true dan false. Metode ToString() juga akan ditimpa, mengembalikan string "true" atau "false".

Sayangnya, objek Boolean jarang digunakan di ECMAScript, bahkan jika digunakan, sulit untuk dipahami.

Masalah biasanya muncul saat menggunakan objek Boolean di ekspresi Boolean. Contohnya:

var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true;	//Output true

Pada kode di bagian ini, objek Boolean dibuat dengan nilai false. kemudian nilai ini dioperasikan AND dengan nilai asli true. Hasil operasi AND antara false dan true di dalam operasi Boolean adalah false. Namun, di baris kode ini, dihitung adalah oFalseObject, bukan nilai false nya.

Seperti yang disebutkan sebelumnya, di ekspresi Boolean, semua objek akan otomatis diubah menjadi true, jadi nilai oFalseObject adalah true. kemudian true dioperasikan AND dengan true, hasilnya adalah true.

Perhatian:Walaupun anda seharusnya mengetahui ketersediaan objek Boolean, tetap saja lebih baik menggunakan nilai asli Boolean untuk menghindari masalah yang disebutkan di bagian ini.

Lihat

Untuk mendapatkan informasi lebih lanjut tentang objek Boolean, kunjungi Referensi Buku Objek Boolean JavaScript.

Objek Number

Seperti yang anda sangka, objek Number adalah tipe referensi untuk tipe asli Number. Untuk membuat objek Number, gunakan kode berikut:

var oNumberObject = new Number(68);

Anda seharusnya sudah mengenali objek Number yang disebutkan di bab ini tentang nilai khusus (seperti Number.MAX_VALUE). Semua nilai khusus adalah properti statis objek Number.

Untuk mendapatkan nilai asli Number objek numerik, cukup menggunakan metode valueOf():

var iNumber = oNumberObject.valueOf();

Tentu saja, kelas Number juga memiliki metode toString(), seperti yang telah disebutkan secara detil dalam bagian tentang konversi tipe.

Selain metode standar yang diwarisi dari objek Object, objek Number juga memiliki beberapa metode khusus untuk pengolahan angka.

Metode toFixed()

Metode toFixed() mengembalikan bentuk string angka dengan digit desimal yang ditentukan. Misalnya:

var oNumberObject = new Number(68);
alert(oNumberObject.toFixed(2));  //Output "68.00"

Di sini, parameter metode toFixed() adalah 2, yang berarti harus menampilkan 2 digit desimal. Metode ini mengembalikan "68.00", spasi yang kosong diisi dengan 0. Metode ini sangat berharga untuk aplikasi pemrosesan uang. Metode toFixed() dapat menampung angka dengan 0 hingga 20 digit desimal, nilai yang melebihi rentang ini akan memicu kesalahan.

Metode toExponential()

Metode lain yang berhubungan dengan pengformatan angka adalah toExponential(), yang mengembalikan bentuk string angka dalam bentuk persamaan ilmiah.

Seperti metode toFixed(), metode toExponential() juga memiliki parameter yang menentukan jumlah digit desimal yang akan dihasilkan. Misalnya:

var oNumberObject = new Number(68);
alert(oNumberObject.toExponential(1));  //Output "6.8e+1"

Hasil kode ini adalah "6.8e+1", seperti yang dijelaskan sebelumnya, ini berarti 6.8x101Masalahnya, jika tidak tahu bentuk yang harus digunakan (bentuk yang ditetapkan atau bentuk eksponensial) untuk mewakili angka, dapat menggunakan metode toPrecision().

Metode toPrecision()

Metode toPrecision() mengembalikan bentuk yang ditetapkan atau bentuk eksponensial angka berdasarkan bentuk yang paling berarti. Dia memiliki parameter, yaitu jumlah digit yang digunakan untuk mewakili angka (tanpa eksponensial). Misalnya,

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(1));  //Output "7e+1"

Tugas kode ini adalah untuk menampung angka 68 dengan satu digit, hasilnya adalah "7e+1", dalam bentuk lain yaitu 70. Pasti, metode toPrecision() akan membulat angka.

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(2));  //Output "68"

Tentu saja, yang dihasilkan adalah "68", karena itu adalah penampakan akurat dari angka ini. Namun, bagaimana jika digit yang ditentukan lebih banyak daripada yang diperlukan?

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(3));  //keluar "68.0"

Dalam kasus ini, toPrecision(3) sama dengan toFixed(1), yang mengeluarkan "68.0".

Metode toFixed(), toExponential(), dan toPrecision() akan melakukan operasi pengurangan untuk menampilkan angka dengan jumlah desimal yang benar.

Petunjuk:Seperti objek Boolean, objek Number juga penting, tetapi seharusnya digunakan sedikit untuk menghindari masalah yang mungkin terjadi. Selama mungkin, gunakan ekspresi asli bilangan.

Lihat

Untuk informasi lebih lanjut tentang objek Number, kunjungi Referensi Buku Objek Number JavaScript.

Objek String

Objek String adalah ekspresi objek tipe asli String, yang dibuat dengan cara berikut:

var oStringObject = new String("hello world");

Metode valueOf() dan toString() objek String akan mengembalikan nilai asli tipe String:

alert(oStringObject.valueOf() == oStringObject.toString());	//keluar "true"

Jika menjalankan kode ini, outputnya adalah "true", yang menunjukkan bahwa nilai ini benar-benar sama.

Keterangan:Objek String adalah salah satu jenis referensi yang kompleks di ECMAScript. Demikian pula, fokus bagian ini hanya kepada fungsi dasar String. Untuk fungsi tingkat tinggi lainnya, silakan baca bagian yang relevan di tutorial ini, atau lihat Referensi Buku Objek String JavaScript.

Properti length

Objek String memiliki properti length, yang adalah jumlah karakter di dalam string:

var oStringObject = new String("hello world");
alert(oStringObject.length);	//keluar "11"

Contoh ini mengeluarkan "11", yaitu jumlah karakter di "hello world". Perhatikan, bahkan jika string mengandung karakter double-byte (berbanding dengan karakter ASCII yang hanya mengambil satu byte), setiap karakter dihitung hanya satu karakter.

Metode charAt() dan charCodeAt()

Objek String juga memiliki banyak metode.

Pertama, metode charAt() dan charCodeAt() mengakses karakter tunggal di dalam string. Kedua metode ini memiliki parameter, yaitu posisi karakter yang akan dioperasikan.

charAt() metode mengembalikan string yang mengandung karakter di posisi yang ditentukan:

var oStringObject = new String("hello world");
alert(oStringObject.charAt(1));	//keluar "e"

Dalam string "hello world", karakter di posisi 1 adalah "e". Dalam bagian "ECMAScript Original Type", kami telah disebutkan bahwa posisi karakter pertama adalah 0, posisi karakter kedua adalah 1, dan seterusnya. Oleh karena itu, pemanggilan charAt(1) mengembalikan "e".

Jika ingin mendapatkan bukan karakter, tetapi kode karakter, maka dapat dipanggil metode charCodeAt():

var oStringObject = new String("hello world");
alert(oStringObject.charCodeAt(1));	//keluaran "101"

Contoh ini menampilkan "101", yaitu kode karakter untuk huruf kecil "e".

Metode concat()

Berikut adalah metode concat(), yang digunakan untuk menambahkan satu atau lebih string ke nilai asli String objek. Metode ini mengembalikan nilai asli String, tetap menjaga objek String asli:

var oStringObject = new String("hello ");
var sResult = oStringObject.concat("world");
alert(sResult);		//keluaran "hello world"
alert(oStringObject);	//keluaran "hello "

Dalam kode ini, penggunaan metode concat() mengembalikan "hello world", tetapi objek String tetap berisi "hello ". Karena alasan ini, yang paling sering digunakan adalah penggunaan tanda plus (+) untuk menggabungkan string, karena bentuk ini secara logis menunjukkan perilaku yang sebenarnya:

var oStringObject = new String("hello ");
var sResult = oStringObject + "world";
alert(sResult);		//keluaran "hello world"
alert(oStringObject);	//keluaran "hello "

indexOf() dan lastIndexOf() metode

Hingga sekarang, telah disebutkan tentang metode menggabungkan string, dan metode mengakses karakter tunggal di dalam string. Namun, jika tidak dapat dipastikan apakah karakter benar-benar ada di dalam string tertentu, maka seharusnya memanggil metode apa? Pada saat ini, dapat dipanggil metode indexOf() dan lastIndexOf().

indexOf() dan lastIndexOf() metode keduanya mengembalikan posisi substring yang ditentukan di dalam string lain, jika substring tidak ditemukan, maka kembalikan -1.

Perbedaan antara kedua metode ini adalah bahwa indexOf() metode mulai mencari string dari awal (lokasi 0), sementara lastIndexOf() metode mulai mencari substring dari akhir. Contoh:

var oStringObject = new String("hello world!");
alert(oStringObject.indexOf("o"));		//Output "4"
alert(oStringObject.lastIndexOf("o"));		//Output "7"

Di sini, string pertama "o" muncul di posisi 4, yaitu "hello" di posisi "o"; string terakhir "o" muncul di posisi 7, yaitu "world" di posisi "o". Jika string hanya memiliki satu string "o", maka method indexOf() dan lastIndexOf() mengembalikan posisi yang sama.

Metode localeCompare()

Metode berikutnya adalah localeCompare(), untuk mengurutkan string. Metode ini memiliki parameter - string yang akan dibandingkan, kembalian adalah salah satu dari tiga nilai berikut:

  • Jika objek String disusun menurut abjad di depan string yang diargumen, kembalian adalah bilangan negatif.
  • Jika objek String sama dengan string yang diargumen, kembalian adalah 0
  • Jika objek String disusun menurut abjad di belakang string yang diargumen, kembalian adalah bilangan positif.

Keterangan:Jika nilai kembalian adalah negatif, paling sering adalah -1, tetapi yang sebenarnya diembalikan adalah yang diputuskan oleh implementasi. Jika nilai kembalian adalah positif, sama seperti itu, paling sering adalah 1, tetapi yang sebenarnya diembalikan adalah yang diputuskan oleh implementasi.

Contoh seperti berikut:

var oStringObject = new String("yellow");
alert(oStringObject.localeCompare("brick"));		//Output "1"
alert(oStringObject.localeCompare("yellow"));		//Output "0"
alert(oStringObject.localeCompare("zoo"));		//Output "-1"

Dalam kode ini, string "yellow" dibandingkan dengan 3 nilai, yaitu "brick", "yellow", dan "zoo". Karena diurutkan berdasarkan abjad, "yellow" berada setelah "brick", jadi method localeCompare() mengembalikan 1; "yellow" sama dengan "yellow", jadi method localeCompare() mengembalikan 0; "zoo" berada setelah "yellow", method localeCompare() mengembalikan -1. Ulangi lagi, karena nilai yang diembalikan diputuskan oleh implementasi, jadi lebih baik memanggil method localeCompare() seperti berikut:

var oStringObject1 = new String("yellow");
var oStringObject2 = new String("brick");
var iResult = oStringObject1.localeCompare(oStringObject2);
if(iResult < 0) {
  alert(oStringObject1 + " datang sebelum " + oStringObject2);
}
  alert(oStringObject1 + " datang setelah " + oStringObject2);
}
  alert("Kedua string ini sama");
}

Dengan struktur ini, dapat disamakan bahwa kode ini akan berjalan dengan benar di semua implementasi.

Karakteristik khusus metode localeCompare() adalah bahwa region (locale, yang mencakup negara/daerah dan bahasa) yang diimplementasikan menentukan cara kerja metode ini. Di Amerika, bahasa Inggris adalah bahasa standar ECMAScript implementasi, localeCompare() membedakan huruf besar dan kecil, huruf besar berada di belakang huruf kecil dalam urutan abjad. Namun, di daerah lain, situasi mungkin tidak seperti itu.

slice() dan substring()

ECMAScript menyediakan dua metode untuk membuat nilai string dari substruktur, yaitu slice() dan substring(). Kedua metode ini kembalikan sub string yang akan ditangani, menerima satu atau dua parameter. Parameter pertama adalah posisi awal sub string yang akan diambil, parameter kedua (jika digunakan) adalah posisi penghentian sub string sebelumnya (yaitu, karakter posisi penghentian tidak termasuk dalam nilai yang diambil). Jika parameter kedua diabaikan, posisi penghentian secara default adalah panjang string.

Dengan mirip dengan metode concat(), metode slice() dan substring() tidak mengubah nilai asli objek String. Mereka hanya kembalikan nilai String asli, tetap menjaga objek String tetap.

var oStringObject = new String("hello world");
alert(oStringObject.slice("3")); // keluaran "lo world"
alert(oStringObject.substring("3")); // keluaran "lo world"
alert(oStringObject.slice("3", "7")); // keluaran "lo w"
alert(oStringObject.substring("3", "7")); // keluaran "lo w"

Dalam contoh ini, penggunaan slice() dan substring() sama, dan nilai kembalikan juga sama. Ketika hanya parameter 3, kedua method mengembalikan "lo world", karena "l" kedua di "hello" berada di posisi 3. Ketika ada dua parameter "3" dan "7", kedua method mengembalikan nilai yang sama "lo w" (huruf "o" di "world" berada di posisi 7, jadi ia tidak termasuk dalam hasil).

Mengapa ada dua method yang memiliki fungsi yang sama? Sebenarnya, keduanya tidak sama, tetapi hanya saat parameter negatif, cara mereka menangani parameter sedikit berbeda.

Untuk parameter negatif, method slice() akan menggunakan panjang string ditambahkan parameter, sementara method substring() akan menganggapnya sebagai 0 (yang artinya akan diabaikan). Contoh:

var oStringObject = new String("hello world");
alert(oStringObject.slice("-3")); // keluaran "rld"
alert(oStringObject.substring("-3")); // keluaran "hello world"
alert(oStringObject.slice("3, -4")); // keluaran "lo w"
alert(oStringObject.substring("3, -4")); // keluaran "hel"

Dengan cara ini, dapat dilihat perbedaan utama antara method slice() dan substring().

Ketika hanya parameter -3, slice() mengembalikan "rld", substring() mengembalikan "hello world". Ini disebabkan untuk string "hello world", slice("-3") akan diubah menjadi slice("8"), sementara substring("-3") akan diubah menjadi substring("0").

Juga, saat digunakan parameter 3 dan -4, perbedaan jelas. slice() akan diubah menjadi slice(3, 7), yang sama seperti contoh sebelumnya, mengembalikan "lo w". Sementara method substring() akan menginterpretasi parameter parameter tersebut sebagai substring(3, 0), yang sebenarnya adalah substring(0, 3), karena substring() selalu menggunakan angka yang kecil sebagai posisi awal dan angka yang besar sebagai posisi akhir. Jadi, substring("3, -4") mengembalikan "hel". Baris kode terakhir digunakan untuk menjelaskan bagaimana cara menggunakan metode ini.

toLowerCase(), toLocaleLowerCase(), toUpperCase(), dan toLocaleUpperCase()

Setelah ini, sekumpulan metode yang akan disebutkan melibatkan konversi besar ke kecil dan ke besar. Ada 4 metode untuk melaksanakan konversi besar ke kecil dan ke besar, yaitu

  • toLowerCase()
  • toLocaleLowerCase()
  • toUpperCase()
  • toLocaleUpperCase()

Dari namanya dapat dilihat fungsinya, dua metode pertama digunakan untuk mengubah string menjadi huruf kecil, dan dua metode berikutnya digunakan untuk mengubah string menjadi huruf besar.

toLowerCase() dan toUpperCase() metode asli, yang diimplementasikan berdasarkan prototipe metode yang sama di java.lang.String.

toLocaleLowerCase() dan toLocaleUpperCase() metode berdasarkan daerah khusus (yang sama seperti metode localeCompare()). Dalam banyak daerah, metode khusus daerah sama dengan metode umum. Namun, beberapa bahasa menerapkan aturan khusus untuk konversi besar ke kecil dan ke besar Unicode (contoh: Turki), jadi harus menggunakan metode khusus daerah untuk melakukan konversi yang benar.

var oStringObject = new String("Hello World");
alert(oStringObject.toLocaleUpperCase()); // 输出 "HELLO WORLD"
alert(oStringObject.toUpperCase()); // 输出 "HELLO WORLD"
alert(oStringObject.toLocaleLowerCase()); // 输出 "hello world"
alert(oStringObject.toLowerCase()); // Output 'hello world'

Pada kode ini, toUpperCase() dan toLocaleUpperCase() mengeluarkan 'HELLO WORLD', sementara toLowerCase() dan toLocaleLowerCase() mengeluarkan 'hello world'. Secara umum, jika tidak diketahui diapa kode berbahasa yang berjalan dalam pengkodean tertentu, penggunaan metode yang berdasarkan area spesifik lebih aman.

Petunjuk:Ingat, semua properti dan metode Objek String dapat digunakan untuk nilai asli String, karena mereka adalah pseudo-obyek.

Operator instanceof

Pada saat menggunakan operator typeof untuk menyimpan nilai tipe referensi, ada masalah yang timbul, karena apapun tipe obyek yang disimpan, ia selalu mengembalikan 'object'. ECMAScript memperkenalkan operator lain instanceof untuk memperbaiki masalah ini.

Operator instanceof mirip dengan operator typeof, digunakan untuk mengidentifikasi tipe obyek yang sedang diproses. Berbeda dengan metode typeof, metode instanceof meminta para pengembang untuk menegaskan secara eksplisit bahwa obyek adalah tipe tertentu. Contohnya:

var oStringObject = new String("hello world");
alert(oStringObject instanceof String); // Output 'true'

Kode ini menanyakan apakah 'variable oStringObject' adalah instansi Objek String? oStringObject sebenarnya adalah instansi Objek String, sehingga hasilnya 'true'. Meskipun kurang fleksibel seperti metode typeof, metode instanceof masih sangat bermanfaat ketika metode typeof mengembalikan 'object'.