Day 8 — JavaScript Data Types, typeof, Conversion, and Equality
Catatan dari materi Data Type. Materi membahas delapan data type JavaScript, fokus pada number, string, boolean, undefined, null, object, dan BigInt sebagai tambahan modern; perbedaan dynamic typing JavaScript dengan statically typed language seperti C; cara memakai typeof; bug historis typeofnull; manual dan automatic type conversion/type coercion; truthy/falsy; string concatenation; loose equality == vs strict equality ===; serta Q&A tentang literal binary/hexadecimal dan naming boolean.
Bug notes
Bug karena memakai == saat butuh comparison yang aman
Conditional bisa true walaupun type data berbeda.
Solusi: Gunakan === dan !== sebagai default untuk comparison.
Bug karena variable berubah type tanpa sadar
Logic program menjadi tidak masuk akal, misalnya age berisi "hello" atau true.
Solusi: Jaga konsistensi value, gunakan nama variable yang jelas, dan cek type saat menerima input dari luar.
Kebingungan karena typeofnull menghasilkan object
Developer pemula bisa salah menyimpulkan bahwa null adalah object.
Solusi: Ingat sebagai special case: cek null dengan value === null
Komentar pembaca
Komentar akan muncul setelah disetujui admin.
Belum ada komentar yang disetujui.
Tulis komentar
Hari ini aku belajar materi Data Type - Cohort 2. Kelas dibuka dengan reminder assignment: untuk assignment pertama masih diberi kelonggaran sampai akhir hari, tetapi ke depan due date akan lebih tegas. Setelah itu materi utama dimulai: data type dalam programming language, khususnya JavaScript.
JavaScript memiliki delapan jenis data type: number, string, boolean, undefined, null, symbol, object, dan BigInt. BigInt diperkenalkan lebih baru sekitar 2019 dan tidak terlalu sering dipakai untuk materi dasar, jadi fokus utama kelas adalah tujuh data type yang lebih sering muncul. Number dipakai untuk angka seperti 5, 6, atau 20. Di JavaScript tidak ada data type integer, float, atau double secara terpisah seperti di beberapa bahasa lain; semuanya masuk ke number. String adalah teks yang ditulis dengan quote, misalnya 'hello world'. Boolean hanya punya dua value: true atau false.
Undefined dan null dijelaskan sebagai data type yang unik. Jika sebuah variable dideklarasikan tanpa value, JavaScript otomatis memberi value undefined. Karena value-nya undefined, data type-nya juga undefined. Null adalah value khusus yang sengaja dipakai untuk menunjukkan tidak ada value atau kosong secara eksplisit. Secara konsep, data type null adalah null, tetapi nanti ada keanehan saat dicek memakai typeof.
Materi juga membahas naming untuk variable boolean. Kalau sebuah variable berisi true/false, nama variable sebaiknya berupa pertanyaan atau kondisi, misalnya isGraduated, isMarried, hasChildren, wasActive, atau areReady. Dengan membaca nama variable saja, developer lain bisa menebak bahwa isinya boolean. Ini membantu readability dan membuat intent kode lebih jelas.
Setelah itu dibahas perbedaan JavaScript dengan bahasa seperti C. Dalam C, data type harus ditulis secara eksplisit, misalnya integer x. Jika sudah dideklarasikan sebagai integer lalu diisi string seperti 'hello', akan terjadi compile time error. Bahasa seperti itu disebut statically typed language. JavaScript berbeda karena data type tidak perlu ditulis. JavaScript mendeteksi atau meng-infer type saat runtime berdasarkan value yang diberikan. Karena itu JavaScript disebut dynamically typed language.
Dynamic typing membuat JavaScript fleksibel, tetapi juga berbahaya. Variable age bisa awalnya berisi number 20, lalu di-reassign menjadi string 'hello', lalu bahkan boolean true. Secara syntax JavaScript bisa menerima ini, tetapi secara makna program bisa menjadi tidak masuk akal. Inilah salah satu sumber bugruntime: data type berubah tanpa disadari.
Untuk mengecek data type, JavaScript menyediakan operator typeof. typeofundefined menghasilkan string 'undefined'. typeof 5 menghasilkan string 'number'. typeof true menghasilkan string 'boolean'. typeof 'hello' menghasilkan string 'string'. Karena hasil typeof sendiri adalah string, kalau hasil typeof dicek lagi dengan typeof, hasilnya bisa menjadi 'string'.
Keanehan besar muncul pada typeofnull. Secara konsep, null adalah data type sendiri. Namun typeofnull menghasilkan 'object'. Ini dijelaskan sebagai bug historis JavaScript dari masa awal saat Brendan Eich membuat JavaScript dalam waktu sangat singkat. Bug ini pernah ingin diperbaiki, tetapi tidak bisa karena terlalu banyak website sudah bergantung pada behavior lama. Jika diubah, banyak website lama bisa rusak. Jadi sampai sekarang typeofnull tetap menghasilkan 'object'.
Materi berikutnya adalah type conversion. Type conversion berarti mengubah data dari satu type ke type lain. Ada dua jenis: manual type conversion dan automatic type conversion. Manual conversion dilakukan secara eksplisit oleh developer, misalnya String(age) untuk mengubah number menjadi string, Number('123') untuk mengubah string angka menjadi number, atau Boolean(1) untuk mengubah number menjadi boolean.
Saat number 20 dikonversi menjadi string '20', tampilan saat console.log mungkin sama-sama terlihat 20. Namun representasi di memory berbeda. Number disimpan sebagai data numerik, sedangkan string disimpan sebagai rangkaian karakter. Ini menghubungkan kembali materi binary/encoding sebelumnya: isi yang terlihat sama bisa disimpan berbeda oleh komputer karena data type-nya berbeda.
Boolean conversion juga dibahas detail. Boolean(1) menghasilkan true, Boolean(0) menghasilkan false. Untuk number, 0 menjadi false, sedangkan selain 0 seperti 1, 1000, atau -1 menjadi true. Untuk string, string kosong '' menjadi false, sedangkan string yang punya isi apa pun menjadi true, termasuk string '0' atau teks lain. Ini penting untuk memahami truthy dan falsy value di JavaScript.
Automatic type conversion disebut type coercion. JavaScript kadang otomatis mengubah type agar operasi bisa berjalan. Misalnya '8' / '2' bisa menghasilkan 4 karena JavaScript mengubah string angka menjadi number sebelum melakukan pembagian. Namun pada operator +, jika number ditambah string, JavaScript cenderung mengubah number menjadi string lalu melakukan string concatenation. Contoh 20 + ' years old' menghasilkan '20 years old'. Fitur ini berguna untuk menggabungkan teks, tetapi juga bisa menjadi sumber bug jika tidak sadar type yang terlibat.
Demo dilakukan dengan membuat folder learn-data-type, membuat file index.js, dan menjalankan node index.js. Dari demo terlihat bahwa variable tanpa value menghasilkan undefined, typeof age menghasilkan number, typeof name menghasilkan string, typeof isMarried menghasilkan boolean, dan typeofnull menghasilkan object. Demo juga memperlihatkan Boolean(0), Boolean(1), Boolean(''), Boolean('hello'), Number(true), Number(false), serta automatic conversion seperti '8' / '2' dan age + ' years old'.
Bagian terakhir adalah equality operator. Loose equality == membandingkan dua value dengan kemungkinan type coercion. Contoh 2 == 3 menghasilkan false. 'A' == 'a' juga false karena decimal representation/Unicode point berbeda. Namun 10 == '10' menghasilkan true karena JavaScript melakukan coercion dan membandingkan tampilan/value setelah conversion. false == 0 juga bisa true. Ini dijelaskan sebagai keputusan desain lama JavaScript yang dibuat agar mudah dipakai pemula, tetapi akhirnya menjadi sumber behavior aneh.
Untuk memperbaiki masalah loose equality, JavaScript kemudian memperkenalkan strict equality ===. Strict equality melakukan dua langkah: pertama membandingkan data type, lalu membandingkan value. Jika type berbeda, hasil langsung false. Karena itu 10 === '10' bernilai false, sedangkan 10 === 10 bernilai true. Rekomendasi utama kelas adalah selalu memakai === dan !== sebagai default, bukan == atau !=, meskipun strict equality sedikit lebih mahal secara proses karena ada pengecekan type.
Q&A membahas beberapa tambahan. Literal binary bisa ditulis dengan prefix 0b, misalnya 0b0010 untuk nilai 2 atau 0b0110 untuk nilai 6. Literal hexadecimal bisa ditulis dengan prefix 0x, misalnya 0x7D untuk 125 atau 0xFF untuk 255. Browser yang disarankan untuk testing frontend adalah Chrome karena market share paling besar. Untuk naming boolean, prefix seperti is atau has tidak secara syntax wajib, tetapi secara professional convention sangat dianjurkan agar kode lebih jelas.
Kesimpulannya, data type adalah fondasi penting sebelum masuk logic yang lebih kompleks. JavaScript memang fleksibel karena dynamically typed dan punya automatic conversion, tetapi fleksibilitas ini harus dipakai dengan hati-hati. Aku perlu membiasakan diri mengecek type dengan typeof, memahami truthy/falsy, melakukan conversion secara eksplisit saat perlu, dan memakai strict equality === agar logic lebih aman.
=== membandingkan type dan value, sehingga 10 === "10" false dan 10 === 10 true.
• Number mencakup angka di JavaScript JavaScript tidak memisahkan integer, float, dan double untuk materi dasar; semuanya masuk ke number.
• typeof dipakai untuk mengecek data type typeof 5 menghasilkan "number", typeof true menghasilkan "boolean", dan typeof "text" menghasilkan "string".
• Boolean hanya berisi true atau false Boolean cocok untuk variable yang berupa kondisi atau pertanyaan seperti isGraduated atau hasChildren.
• Type coercion adalah konversi otomatis JavaScript bisa otomatis mengubah string angka menjadi number saat pembagian, atau number menjadi string saat concatenation.
• Konversi manual dilakukan secara eksplisit String(value), Number(value), dan Boolean(value) dipakai untuk mengubah type secara sengaja.
• JavaScript bersifat dynamically typed Data type dideteksi saat runtime dari value, sehingga type variable bisa berubah jika value diubah.
• Truthy dan falsy penting dalam konversi boolean 0 dan string kosong menjadi false, sedangkan number selain 0 dan string berisi karakter menjadi true.
• Dynamic typing fleksibel tetapi rawan bug Variable age bisa berubah dari number ke string atau boolean, tetapi secara makna program bisa menjadi tidak masuk akal.
• JavaScript punya delapan data type Data type JavaScript mencakup number, string, boolean, undefined, null, symbol, object, dan BigInt.
• String adalah teks dalam programming Teks seperti "hello world" disebut string dan ditulis dengan quote.
• typeofnull adalah bug historis Walau null adalah data type sendiri, typeofnull menghasilkan "object" karena bug lama yang tidak bisa diubah demi backward compatibility.
, bukan hanya
typeof
.
Bug dari automatic type coercion
Output bisa tidak sesuai ekspektasi, misalnya number berubah menjadi string saat concatenation.
Solusi: Lakukan konversi manual secara eksplisit sebelum operasi penting.