JavaScript memungkinkan kita bekerja dengan primitif (string, angka, dll.) seolah-olah mereka adalah objek. Mereka juga menyediakan metode untuk memanggil seperti itu. Kita akan segera mempelajarinya, tapi pertama-tama kita akan melihat cara kerjanya karena, tentu saja, primitif bukanlah objek (dan di sini kita akan membuatnya lebih jelas).
Mari kita lihat perbedaan utama antara primitif dan objek.
Sebuah primitif
Merupakan nilai dari tipe primitif.
Ada 7 tipe primitif: string
, number
, bigint
, boolean
, symbol
, null
dan undefined
.
Sebuah objek
Mampu menyimpan banyak nilai sebagai properti.
Dapat dibuat dengan {}
, misalnya: {name: "John", age: 30}
. Ada jenis objek lain dalam JavaScript: fungsi, misalnya, adalah objek.
Salah satu hal terbaik tentang objek adalah kita dapat menyimpan suatu fungsi sebagai salah satu propertinya.
biarkan john = { nama: "Yohanes", sapa: fungsi() { alert("Hai sobat!"); } }; john.sayHi(); // Hai sobat!
Jadi disini kita telah membuat objek john
dengan metode sayHi
.
Banyak objek bawaan yang sudah ada, seperti objek yang berfungsi dengan tanggal, kesalahan, elemen HTML, dll. Objek tersebut memiliki properti dan metode yang berbeda.
Namun, fitur-fitur ini ada harganya!
Benda “lebih berat” dibandingkan benda primitif. Mereka memerlukan sumber daya tambahan untuk mendukung mesin internal.
Inilah paradoks yang dihadapi oleh pencipta JavaScript:
Ada banyak hal yang ingin dilakukan dengan primitif, seperti string atau angka. Akan sangat bagus untuk mengaksesnya menggunakan metode.
Primitif harus secepat dan seringan mungkin.
Solusinya terlihat agak janggal, tapi ini dia:
Primitif masih primitif. Nilai tunggal, sesuai keinginan.
Bahasa ini memungkinkan akses ke metode dan properti string, angka, boolean, dan simbol.
Agar dapat berfungsi, “pembungkus objek” khusus yang menyediakan fungsionalitas tambahan dibuat, dan kemudian dimusnahkan.
"Pembungkus objek" berbeda untuk setiap tipe primitif dan disebut: String
, Number
, Boolean
, Symbol
dan BigInt
. Oleh karena itu, mereka menyediakan serangkaian metode yang berbeda.
Misalnya, terdapat metode string str.toUpperCase() yang mengembalikan str
dengan huruf kapital.
Begini cara kerjanya:
biarkan str = "Halo"; peringatan( str.toUpperCase() ); // HALO
Sederhana, bukan? Inilah yang sebenarnya terjadi di str.toUpperCase()
:
String str
adalah primitif. Jadi pada saat mengakses propertinya, objek khusus dibuat yang mengetahui nilai string, dan memiliki metode yang berguna, seperti toUpperCase()
.
Metode tersebut berjalan dan mengembalikan string baru (ditunjukkan oleh alert
).
Objek khusus dihancurkan, meninggalkan str
primitif saja.
Jadi primitif dapat menyediakan metode, namun tetap ringan.
Mesin JavaScript sangat mengoptimalkan proses ini. Bahkan mungkin melewatkan pembuatan objek tambahan sama sekali. Namun tetap harus mematuhi spesifikasi dan berperilaku seolah-olah menciptakannya.
Suatu bilangan mempunyai metodenya sendiri, misalnya, toFixed(n) membulatkan bilangan tersebut ke presisi tertentu:
misalkan n = 1,23456; peringatan( n.toFixed(2) ); // 1.23
Kita akan melihat metode yang lebih spesifik di bab Angka dan String.
String/Number/Boolean
konstruktor hanya untuk penggunaan internal
Beberapa bahasa seperti Java memungkinkan kita untuk secara eksplisit membuat "objek pembungkus" untuk primitif menggunakan sintaks seperti new Number(1)
atau new Boolean(false)
.
Dalam JavaScript, hal ini juga dimungkinkan karena alasan historis, tetapi sangat tidak disarankan . Segalanya akan menjadi gila di beberapa tempat.
Misalnya:
peringatan(tipe 0); // "nomor" peringatan( jenis Nomor baru(0) ); // "objek"!
Objek selalu benar if
, jadi di sini peringatan akan muncul:
misalkan nol = Angka baru(0); if (zero) { // nol benar, karena itu adalah sebuah objek alert("nol itu benar!?!" ); }
Di sisi lain, menggunakan fungsi yang sama String/Number/Boolean
tanpa new
adalah hal yang baik dan berguna. Mereka mengonversi nilai ke tipe yang sesuai: menjadi string, angka, atau boolean (primitif).
Misalnya, ini sepenuhnya valid:
misalkan angka = Angka("123"); // mengubah string menjadi angka
null/tidak terdefinisi tidak memiliki metode
Primitif khusus null
dan undefined
adalah pengecualian. Mereka tidak memiliki “objek pembungkus” yang sesuai dan tidak menyediakan metode. Dalam arti tertentu, mereka adalah “yang paling primitif”.
Upaya untuk mengakses properti dengan nilai tersebut akan menghasilkan kesalahan:
alert(null.test); // kesalahan
Primitif kecuali null
dan undefined
menyediakan banyak metode bermanfaat. Kita akan mempelajarinya di bab-bab mendatang.
Secara formal, metode ini bekerja melalui objek sementara, namun mesin JavaScript telah disetel dengan baik untuk mengoptimalkannya secara internal, sehingga tidak mahal untuk digunakan.
pentingnya: 5
Perhatikan kode berikut:
biarkan str = "Halo"; str.tes = 5; alert(str.test);
Bagaimana menurut Anda, apakah ini akan berhasil? Apa yang akan ditampilkan?
Coba jalankan:
biarkan str = "Halo"; str.tes = 5; // (*) alert(str.test);
Bergantung pada apakah Anda telah use strict
atau tidak, hasilnya mungkin:
undefined
(tidak ada mode ketat)
Kesalahan (mode ketat).
Mengapa? Mari kita putar ulang apa yang terjadi pada baris (*)
:
Ketika properti str
diakses, “objek pembungkus” dibuat.
Dalam mode ketat, menulis ke dalamnya adalah sebuah kesalahan.
Jika tidak, operasi dengan properti akan dilanjutkan, objek mendapatkan properti test
, tetapi setelah itu "objek pembungkus" menghilang, sehingga pada baris terakhir str
tidak memiliki jejak properti tersebut.
Contoh ini dengan jelas menunjukkan bahwa primitif bukanlah objek.
Mereka tidak dapat menyimpan data tambahan.