Tipe Referensi ECMAScript

Tipe referensi biasanya disebut kelas (class).

Dalam tutorial ini akan diserang jenis jenis tipe referensi pradefinisi ECMAScript yang berbagai-bagai.

Tipe referensi

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

Dalam tutorial ini akan diserang jenis jenis tipe referensi pradefinisi ECMAScript yang berbagai-bagai.

Dari sekarang, akan diserang dengan khusus jenis jenis tipe referensi yang rapat kaitannya dengan jenis jenis asal yang telah dibincangkan.

Perhatian:Daripada makna tradisional, ECMAScript sebenarnya tidak mempunyai kelas. Faktanya, kecuali untuk menyatakan kenaikan kelas, kata 'kelas' tidak pernah 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 dan nama objek yang akan diinstansiasi. Misalnya, kode di bawah ini menciptakan instance objek Object:

var o = new Object();

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

var o = new Object;

Perhatian:Walaupun tanda kurung bukan wajib, tetapi untuk menghindari kebingungan, lebih baik menggunakan tanda kurung.

Petunjuk:Kami akan mendalami lebih lanjut 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 cukup menguntungkan, tetapi sebelum mengerti kelas lain, masih harus mengerti ini. Karena objek Object dalam ECMAScript mirip dengan java.lang.Object di Java, semua objek dalam ECMAScript mengambil turunan dari objek ini, semua properti dan metode di dalam objek Object akan muncul di objek lain, jadi mengerti objek Object akan mempermudah mengerti objek lain.

Objek Object memiliki properti berikut:

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

Objek Object juga memiliki beberapa metode:

hasOwnProperty(property)
Pertimbangkan apakah objek memiliki properti khusus. Harus menggunakan string untuk menentukan properti ini. (contoh, o.hasOwnProperty("name"))
IsPrototypeOf(object)
Pertimbangkan apakah objek ini adalah prototipe dari objek lain.
PropertyIsEnumerable
Pertimbangkan apakah properti yang diberikan dapat diekspor dengan kalimat for...in.
ToString()
Kembalikan representasi string asli objek. Untuk objek Object, ECMA-262 tidak mendefinisikan nilai ini, jadi beberapa implementasi ECMAScript memiliki nilai yang berbeda.
ValueOf()
Kembalikan nilai asli yang paling sesuai untuk objek ini. Untuk banyak objek, nilai yang dihasilkan oleh metode ini sama dengan nilai yang dihasilkan oleh fungsi 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, hanya perlu mengirimkan 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;	//keluaran true

Dalam kode ini, objek Boolean dibuat dengan nilai false. kemudian nilai ini akan 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 secara otomatis diubah menjadi true, jadi nilai oFalseObject adalah true. kemudian true akan melakukan operasi AND dengan true, hasilnya adalah true.

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

参阅

Untuk mendapatkan informasi lebih lanjut tentang objek Boolean, kunjungi Panduan Objek Boolean JavaScript

Objek Number

Seperti yang anda ingatkan, 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 sebelum bagian kecil tentang nilai khusus (seperti Number.MAX_VALUE). Semua nilai khusus adalah properti statis objek Number.

Untuk mendapatkan nilai asli Number objek digital, hanya perlu menggunakan metode valueOf():

var iNumber = oNumberObject.valueOf();

Tentu saja, class Number juga mempunyai metod toString(), yang telah dibincangkan secara rinci dalam bab tentang pengubahsuaian jenis.

Di samping metod standar yang diserahkan daripada Object, Object Number mempunyai beberapa metod khusus untuk mengelola nombor.

Metod toFixed()

Metod toFixed() mengembalikan bentuk string nombor dengan digit desimal yang ditentukan. Contohnya:

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

Di sini, parameter metod toFixed() adalah 2, yang menunjukkan harus dipaparkan dua digit desimal. Metod ini mengembalikan "68.00", string kosong diisi dengan 0. Metod ini sangat berguna untuk aplikasi yang mengelola wang. Metod toFixed() dapat mengekspresikan nombor dengan 0 hingga 20 digit desimal, nilai yang melebihi rentang ini akan memunculkan kesalahan.

Metod toExponential()

Metod lain yang berhubungan dengan format nombor adalah toExponential(), yang mengembalikan bentuk string nombor dalam bentuk bilangan eksponen.

Seperti metod toFixed(), metod toExponential() juga mempunyai parameter yang menentukan bilangan digit desimal yang akan dioutput. Contohnya:

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

Hasil kod ini adalah "6.8e+1", seperti yang dijelaskan sebelumnya, ia merepresentasikan 6.8x101Masalahnya, bagaimana jika tidak tahu bentuk mana (bentuk pasti atau bentuk eksponen) yang harus digunakan untuk mewakili nombor? Boleh menggunakan metod toPrecision().

Metod toPrecision()

Metod toPrecision() mengembalikan bentuk nombor yang ditetapkan atau bentuk eksponen berdasarkan bentuk yang paling berarti. Ia mempunyai parameter, iaitu jumlah digit yang digunakan untuk mewakili nombor (tidak termasuk eksponen). Contohnya,

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

Tugas kod ini adalah untuk mewakili nombor 68 dengan satu digit, hasilnya adalah "7e+1", wujud lainnya adalah 70. Pasti, metod toPrecision() akan mengurangkan nombor.

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

Tentu saja, output adalah "68", kerana ia adalah wujud pasti bagi nombor itu. Bagaimanapun, bagaimana jika digit yang dinyatakan lebih banyak daripada yang diperlukan?

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

在这种情况下,toPrecision(3) 等价于 toFixed(1),输出的是 "68.0"。

toFixed()、toExponential() 和 toPrecision() 方法都会进行舍入操作,以便用正确的小数位数正确地表示一个数。

Petunjuk:与 Boolean 对象相似,Number 对象也很重要,不过应该少用这种对象,以避免潜在的问题。只要可能,都使用数字的原始表示法。

参阅

如需更多有关 Number 对象的信息,请访问 Panduan Objek Bilangan JavaScript

String 对象

String 对象是 String 原始类型的对象表示法,它是以下方式创建的:

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

String 对象的 valueOf() 方法和 toString() 方法都会返回 String 类型的原始值:

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

如果运行这段代码,输出是 "true",说明这些值真的相等。

Keterangan:String 对象是 ECMAScript 中比较复杂的引用类型之一。同样,本节的重点只是 String 类的基本功能。更多的高级功能请阅读本教程相关的章节,或参阅 Panduan Objek String JavaScript

length 属性

String 对象具有属性 length,它是字符串中的字符个数:

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

这个例子输出的是 "11",即 "hello world" 中的字符个数。注意,即使字符串包含双字节的字符(与 ASCII 字符相对,ASCII 字符只占用一个字节),每个字符也只算一个字符。

charAt() 和 charCodeAt() 方法

String 对象还拥有大量的方法。

首先,两个方法 charAt() 和 charCodeAt() 访问的是字符串中的单个字符。这两个方法都有一个参数,即要操作的字符的位置。

charAt() 方法返回的是包含指定位置处的字符的字符串:

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

Dalam string "hello world", huruf di kedudukan 1 adalah "e". Dalam bab "ECMAScript Original Type", kami telah bercakap tentang kedudukan pertama huruf adalah 0, kedudukan kedua huruf adalah 1, dan seterusnya. Oleh itu, pemanggilan charAt(1) mengembalikan "e".

Jika ingin mendapatkan bukan huruf, tetapi kod huruf, boleh dipanggil kaedah charCodeAt():

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

Contoh ini mengeluarkan "101", iaitu kod huruf kecil "e".

Kaedah concat()

Berikut adalah kaedah concat(), digunakan untuk menggabungkan satu atau lebih string ke nilai asal String objek. Kaedah ini mengembalikan nilai asal String, tetapkan objek String asal:

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

Dalam kod ini, concat() kaedah mengembalikan "hello world", manakala objek String tetap "hello ". Oleh sebab itu, paling sering digunakan adalah penggabungan string dengan tanda plus (+), kerana bentuk ini menunjukkan perilaku sebenar:

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

indexOf() dan lastIndexOf() kaedah

Sampai kini, telah dibincangkan kaedah untuk menggabungkan string, dan kaedah untuk mengakses satu huruf tunggal di dalam string. Walau bagaimanapun, jika tak dapat dipastikan sama ada ada huruf di dalam string tertentu, kaedah yang sepatutnya dipanggil adalah indexOf() dan lastIndexOf().

indexOf() dan lastIndexOf() kaedah mengembalikan kedudukan substr di dalam string lain, jika substr tak dapat ditemui, maka balikan -1.

Perbezaan antara kedua kaedah ini adalah bahawa indexOf() kaedah adalah mencari string dari permulaan (kedudukan 0) string, manakala kaedah lastIndexOf() adalah mencari substr dari penghujung string. Contohnya:

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

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

Metode localeCompare()

Metode berikut adalah localeCompare(), untuk mengurutkan string. Metode ini mempunyai parameter satu - string untuk dibandingkan, kembalikan adalah salah satu dari tiga nilai berikut:

  • Jika objek String disusun dalam urutan abjad sebelum string parameter, kembalikan bilangan negatif.
  • Jika objek String sama dengan string parameter, kembalikan 0
  • Jika objek String disusun dalam urutan abjad setelah string parameter, kembalikan bilangan positif.

Keterangan:Jika nilai kembalian adalah negatif, paling biasa adalah -1, tetapi yang sebenarnya diembalikan adalah diutus oleh penerapan. Jika nilai kembalian adalah positif, paling biasa adalah 1, tetapi yang sebenarnya diembalikan adalah diutus oleh penerapan.

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 kod ini, string "yellow" berbandingkan dengan 3 nilai, iaitu "brick", "yellow" dan "zoo". Sebagai pengurutan abjad, "yellow" berada selepas "brick", jadi localeCompare() mengembalikan 1; "yellow" sama dengan "yellow", jadi localeCompare() mengembalikan 0; "zoo" berada selepas "yellow", localeCompare() mengembalikan -1. Dengan demikian, ingat sekali lagi, nilai yang diembalikan adalah diutus oleh penerapan, jadi lebih baik panggil 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);
} else if (iResult > 0) {
  alert(oStringObject1 + " datang setelah " + oStringObject2);
} else {
  alert("Kedua string ini sama");
}

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

Karakter khas method localeCompare() adalah lokasi (locale, yang mencakup negara/daerah dan bahasa) yang menentukan cara operasi metode ini. Di Amerika, bahasa Inggris adalah bahasa standar ECMAScript, localeCompare() membedakan huruf besar dan kecil, huruf besar diurutkan setelah huruf kecil. Namun, di daerah lain, situasi mungkin tidak seperti itu.

slice() dan substring()

ECMAScript menyediakan dua method untuk membuat nilai string dari substring, yaitu slice() dan substring(). Kedua method ini mengembalikan substring yang akan ditangani, menerima satu atau dua parameter. Parameter pertama adalah posisi awal substring yang akan diambil, parameter kedua (jika digunakan) adalah posisi sebelum substring berakhir (yaitu, karakter posisi akhir tidak termasuk dalam nilai yang diembalikan). Jika parameter kedua diabaikan, posisi akhir secara default adalah panjang string.

Dengan sama seperti method concat(), method slice() dan substring() juga tidak mengubah nilai objek String aslinya. Mereka hanya mengembalikan nilai String asli, mengekalkan 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. Saat hanya ada parameter 3, kedua method mengembalikan "lo world", karena "l" kedua di "hello" berada di posisi 3. Saat 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 sama, hanya saja ketika parameter negatif, cara mereka mengatasi parameter sedikit berbeda.

Untuk parameter negatif, method slice() akan menggunakan panjang string ditambahkan parameter, sementara method substring() akan mengatasi parameter seperti 0 (yang artinya akan diabaikan). Contohnya:

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().

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

同样,使用参数 3 和 -4 时,差别也很明显。slice() 将被转换成 slice(3, 7),与前面的例子相同,返回 "lo w"。而 substring() 方法则将两个参数解释为 substring(3, 0),实际上即 substring(0, 3),因为 substring() 总把较小的数字作为起始位,较大的数字作为终止位。因此,substring("3, -4") 返回的是 "hel"。这里的最后一行代码用来说明如何使用这些方法。

toLowerCase()、toLocaleLowerCase()、toUpperCase() 和 toLocaleUpperCase()

最后一套要讨论的方法涉及大小写转换。有 4 种方法用于执行大小写转换,即

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

从名字上可以看出它们的用途,前两种方法用于把字符串转换成全小写的,后两种方法用于把字符串转换成全大写的。

toLowerCase() 和 toUpperCase() 方法是原始的,是以 java.lang.String 中相同方法为原型实现的。

toLocaleLowerCase() 和 toLocaleUpperCase() 方法是基于特定的区域实现的(与 localeCompare() 方法相同)。在许多区域中,区域特定的方法都与通用的方法完全相同。不过,有几种语言对 Unicode 大小写转换应用了特定的规则(例如土耳其语),因此必须使用区域特定的方法才能进行正确的转换。

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'

Dalam kod ini, toUpperCase() dan toLocaleUpperCase() mengeluarkan 'HELLO WORLD', dan toLowerCase() dan toLocaleLowerCase() mengeluarkan 'hello world'. Secara umum, jika tidak diketahui kode pengoperasian bahasa yang digunakan, penggunaan metode spesifik wilayah adalah yang paling selamat.

Petunjuk:Ingatlah, semua properti dan metod Objek String dapat digunakan untuk nilai asli String, karena mereka adalah pseudo-objek.

Operator instanceof

Sesungguhnya ada masalah jika digunakan operator typeof untuk menyimpan nilai tipe referensi, apapun jenis objek yang disimpan, ia akan mengembalikan 'object'. ECMAScript memperkenalkan operator lain instanceof untuk menyelesaikan masalah ini.

Operator instanceof serupa dengan operator typeof, digunakan untuk mengenali jenis objek yang sedang diproses. Berbeza dengan metode typeof, metode instanceof memerlukan pengembang untuk mengesahkan secara jelas bahawa objek adalah jenis tertentu. Contohnya:

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

Kod ini bertanya 'Apakah objek oStringObject adalah instance Objek String?' Objek oStringObject sebenarnya adalah instance Objek String, jadi hasilnya 'true'. Walaupun kurang fleksibel seperti metode typeof, metode instanceof masih sangat berguna dalam situasi di mana metode typeof mengembalikan 'object'.