Anda mungkin membacanya di suatu tempat, saat mempersiapkan wawancara teknis: “semua yang ada di JavaScript adalah sebuah objek! Bahkan Kelas! Fungsi Genap!”.
JavaScript adalah salah satu (jika bukan “yang”) bahasa paling populer yang digunakan untuk aplikasi web dan server; ini adalah bagian dari standar ECMAScript, dengan setiap spesifikasi baru yang memperkenalkan fitur-fitur tambahan, terus memperbaruinya, dan menambahkan fitur-fitur baru yang menarik — namun tugasnya, dasar keras yang membuat JavaScript begitu serbaguna, apakah benar itu hanya objek yang dibuat?

Kebenarannya sederhana dan rumit. Pada intinya, JavaScript mengategorikan nilai menjadi dua jenis: nilai primitifdan objek. Meskipun JavaScript sering kali tampak sebagai tempat di mana semua nilai tampak bertindak seperti objek, terdapat perbedaan mendasar dan situasi spesifik yang menjadikan perbedaan ini penting.

Pertama, mari kita perjelas primitif dan objeknya.

Primitif, atau nilai primitif, adalah tipe data dasar dalam JavaScript yang bukan objek dan tidak memiliki metode. JavaScript mengenali tujuh tipe data primitif: String, Number, BigInt, Boolean, Undefined, Null, dan Symbol. Jika Anda menggunakan TypeScript, Anda pasti tahu apa yang saya bicarakan (atau bahkan PropTypes di React).

Meskipun tipe primitif ini tidak memiliki properti atau metode secara inheren, JavaScript menyertakan objek yang setara — String, Number, BigInt, Boolean, dan Symbol—yang membungkus pasangan primitifnya masing-masing. Konsep ini disebut 'tinju'.

let str = "Hello, World!"; // this is a string type
console.log(str.length); // 13 - this is a number type

Dalam cuplikan kode di atas, str adalah string primitif, dan ketika kita mereferensikan str.length maka JavaScript secara otomatis 'mengkotak' str menjadi objek String sementara, mengakses properti length, dan kemudian membuang objek sementara tersebut, menciptakan ilusi tindakan primitif sebagai objek. Tetapi kenyataannya tidak!

Berbeda dengan primitif, objekdi JavaScript mewakili kumpulan properti yang masing-masing merupakan koneksi antara kunci dan nilai.
Dan di sini kita semua tahu itu. Nilainya dapat berupa nilai JavaScript apa pun, kecuali null dan undefined dan sebuah objek mampu mewakili berbagai struktur data seperti array, fungsi, dan ekspresi reguler, antara lain (ya, semuanya adalah objek!).

Objek dapat dibuat menggunakan:
- literal objek;
- konstruktor,
- metode Object.create.

Mereka terlihat sangat mirip, tapi apa bedanya?

Perbedaan yang paling penting adalah primitif dalam JavaScript tidak dapat diubah: meskipun JavaScript memungkinkan Anda mengakses properti dan metode pada primitif seolah-olah itu adalah objek, Anda tidak dapat mengubah properti yang sudah ada atau menambahkan properti baru ke primitif. Berikut ini contohnya:

let str = "Hello, World!"; // initiate a string
str.property = "test"; // trying to add a property, as we would do in an obj
console.log(str.property); // undefined - not allowed, but no error

Di sini, JavaScript tidak memunculkan kesalahan saat kami mencoba menetapkan properti baru ke string primitif str! Namun, karena primitif tidak dapat diubah, penugasan tidak berpengaruh, dan akses properti berikutnya mengembalikan undefined , jadi efek “Saya mendengarkan Anda, tetapi tidak, saya tidak akan melakukannya”.

Masih tidak yakin? Izinkan saya mencoba melecehkan string tersebut dengan cara lain, berpura-pura bahwa string tersebut adalah sebuah array (jadi sebuah objek).

let greetings = "hello John";
greetings[0] = "H"; // Attempt to change the first letter to 'H'
console.log(greetings); // "hello", not "Hello"

Karakteristik unik lainnya dari primitif adalah bahwa mereka dibandingkan berdasarkan nilai, bukan berdasarkan referensi seperti yang terjadi pada objek. Ini mungkin lebih intuitif, jika saya bertanya “apakah mug ini sama dengan yang ini” Anda akan memeriksa dua benda di tangan saya dan membandingkannya. Itu intuitif, bukan? Namun dalam JavaScript jika Anda melakukan hal yang sama, membandingkan dua properti, seperti pada contoh berikut, jawabannya adalah false !

let person1 = { age: 18};
let person2 = { age: 18};
console.log(person1 === person2); // false

Mereka identik! Namun kita membandingkan objek referensi(lokasi memori) dan bukan propertinya, dan inilah triknya. Namun membandingkan dua primitif dengan cara yang sama akan menghasilkan hasil yang berbeda.

let myAge = 22; // I wish!
let yourAge= 22;
console.log(myAge === yourAge); // true

Ini berarti ketika Anda membandingkan dua primitif menggunakan ===, JavaScript memeriksa apakah keduanya memiliki nilai yang sama.

Saatnya Menarik Kesimpulan

Jadi, ringkasannya:

  1. Primitifadalah tipe data yang tidak dapat diubahdan sederhana, sedangkan objek dapat berubah dan bisa menjadi lebih kompleks.
  2. Benda primitif dibandingkan berdasarkan nilai, sedangkan objek dibandingkan berdasarkan referensi.
  3. Primitif tidak memiliki properti atau metode, sedangkan objek memilikinya. Namun, JavaScript mengizinkan primitif untuk mengakses metode objek pembungkusnya, memberikan ilusi bahwa primitif memiliki metode (tinju).

Dan sekarang, Anda tahu apa yang harus dijawab saat nanti saat wawancara mereka akan menanyakan pertanyaan rumit dan menarik ini 😉