1 September 2021

Metode primitif

Javascript memperbolehkan kita untuk bekerja dengan primitif (string, angka, dan lain-lain.) seperti jika mereka adalah objek. Mereka juga menyediakan metode untuk dipanggil. Kita akan belajar tentang hal itu nanti, tapi pertama kita akan melihat bagaimana hal itu bekerja, dan juga, primitif bukanlah objek (dan disini kita akan membuat hal itu lebih jelas).

Ayo kita lihat pada kunci perbedaan diantara primitif dan objek.

Primitif

  • Adalah sebuah nilai dari tipe primitif.
  • Ada 7 primitif tipe: string, number, bigint, boolean, symbol, null dan undefined.

Objek

  • Mampu untuk menyimpan banyak nilai sebagai properti.
  • Bisa dibuat dengan menggunakan {}, contoh: {name: "John", age: 30}. Terdapat beberapa macam objek di Javascript: untuk contoh, fungsi, adalah objek.

Salah satu hal yang terbaik tentang objek adalah kita bisa menyimpan fungsi sebagai salah satu dari propertinya.

let john = {
  name: "John",
  sayHi: function() {
    alert("Hi buddy!");
  }
};

john.sayHi(); // Hi buddy!

Jadi disini kita membuat sebuah objek john dengan method sayHi.

Ada juga built-in objek yang tersedia, seperti objek yang bekerja dengan tanggal, error, elemen HTML, dll. Mereka mempunyai properti dan method yang berbeda-beda.

Tapi, fitur ini ada dengan efek samping.

Objek lebih ???berat??? dari primitif. Dan mereka membutuhkan sumber daya tambahan untuk mendukung pekerjaannya.

Sebuah primitif sebagai sebuah objek

Ini adalah paradoks yang dihadapi dari pencipta Javascript:

  • Terdapat banyak hal yang harus dilakukan dengan primitif seperti string atau angka. Akan menjadi lebih baik jika mereka bisa diakses sebagai method.
  • Primitives must be as fast and lightweight as possible.
  • Sebisa mungkin primitif haruslah cepat dan ringan.

Solusinya terlihat sedikit aneh, tapi inilah solusinya:

  1. Primitif masih tetap primitif. Sebuah nilai tunggal, seperti yang diinginkan.
  2. Bahasanya membolehkan untuk mengakses method dan properti dari string, number, boolean dan symbols.
  3. Untuk membuat itu bekerja, ???objek pembungkus??? spesial yang menyediakan fungsionalitas tambahan dibuat, dan lalu dihancurkan.

???Objek pembungkus??? berbeda untuk setiap tipe primitif dan dipanggil: String, Number, Boolean dan Symbol. Lalu, mereka menyediakan metode-metode yang berbeda.

Contoh, ada methode string str.toUpperCase() yang mengembalikan string str yang telah diubah menjadi huruf kapital.

Beginilah caranya itu bekerja:

let str = "Hello";

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

Simpel, kan? Inilah sebenarnya yang terjadi didalam str.toUpperCase():

  1. String str adalah sebuah primitif. Jadi sementara waktu untuk mengakses propertinya, sebuah objek spesial yang tahu tentang nilai dari string dibuat, dan memiliki metode yang berguna, seperti toUpperCase().
  2. Metode itu menjalankan dan mengembalikan string baru (ditampilkan oleh alert).
  3. Objek spesial itu lalu dihancurkan, meninggalkan str primitif.

Jadi primitif bisa menyediakan metode, tapi mereka akan tetap ringan.

Mesin Javascript sangat mengoptimasi proses ini. Ini mungkin akan melewatkan pembuatan dari objek tambahan itu. Tapi itu masih melekat pada spesifikasinya dan bertingkah seperti jika itu memang diciptakan.

Sebuah angka mempunyai metodenya sendiri, contoh toFixed(n) membulatkan angka kedalam presisi yang diberikan:

let n = 1.23456;

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

Kita akan melihat metode spesifik lainnya di bab Angka dan String.

Konstruktor String/Number/Boolean hanya digunakan untuk kebutuhan internal

Beberapa bahasa seperti Java membolehkan kita untuk secara jelas membuat ???objek pembungkus??? untuk primitif menggunakan sintaks seperti new Number(1) atau new Boolean(false).

Didalam javascript, hal itu bisa dilakukan untuk beberapa alasan, tapi sangat tidak direkomendasikan. Beberapa hal akan menjadi rumit di beberapa tempat.

Contoh:

alert( typeof 0 ); // "number"

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

Objek akan selalu truthy didalam if, jadi disini alert akan muncul:

let zero = new Number(0);

if (zero) { // zero adalah true, karena itu adalah sebuah objek
  alert( "zero is truthy!?!" );
}

Disisi lain, menggunakan fungsi yang sama String/Number/Boolean tanpa new adalah hal yang masuk akal dan hal yang berguna. Mereka mengubah nilai kedalam tipe yang sesuai: kedalam sebuah string, sebuah number, atau sebuah boolean(primitif).

Contoh, hal ini sepenuhnya valid:

let num = Number("123"); // mengubah string menjadi angka
null/undefined tidak memiliki method

Primitif spesial null dan undefined adalah pengecualian. Mereka tidak mempunyai ???objek pembungkus??? yang sesuai dan tidak menyediakan metode. Dalam arti tertentu, mereka adalah ???yang paling primitif???.

Percobaan untuk mengakses properti seperti nilai akan memberikan error:

alert(null.test); // error

Ringkasan

  • Primitif kecuali null dan undefined menyediakan banyak metode yang berguna. Kita akan belajar hal itu di bab selanjutnya.
  • Secara formal, metode-metode ini akan bekerja dengan menggunakan objek sementara, tapi mesin Javascript telah dibuat dengan baik untuk mengoptimasi hal itu secara internal, jadi mereka tidaklah sulit untuk dipanggil.

Tugas

Perhatikan kode berikut:

let str = "Hello";

str.test = 5;

alert(str.test);

Bagaimana menurutmu, akankah itu bekerja? apa yang akan muncul?

Cobalah jalankan:

let str = "Hello";

str.test = 5; // (*)

alert(str.test);

Tergantung apakah kamu gunakan use strict atau tidak, hasilnya mungkin bisa:

  1. undefined (bukan strict mode)
  2. An error (strict mode).

Kenapa? Kita lihat apa yang terjadi apda baris (*):

  1. Ketika properti dari str di akses, sebuah ???objek pembungkus??? dibuat.
  2. Didalam mode strict, menulis kedalamnya adalah sebuah error.
  3. Otherwise, the operation with the property is carried on, the object gets the test property, but after that the ???wrapper object??? disappears, so in the last line str has no trace of the property.
  4. Sebaliknya, operasi dengan propertinya dibawa, objeknya mendapatkan properti test, tapi setelah itu ???objek pembungkus??? menghilang, jadi di baris terakhir str tidak mempunyai jejak dari properti itu.

Contoh ini dengan jelas membuktikan bahwa primitif bukanlah sebuah objek

Mereka tidak bisa menyimpan data tambahan.

Peta tutorial