Dalam JavaScript, segala sesuatu adalah objek (atau setidaknya dapat dianggap sebagai objek), kecuali primitif (boolean, null, angka, string, dan nilainya undefined
(dan simbol dalam ES6)):
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
Seperti yang Anda lihat objek, array dan nilainya null
semua dianggap objek ( null
adalah referensi ke objek yang tidak ada). Fungsi dibedakan karena mereka adalah tipe khusus objek yang bisa dipanggil . Namun mereka masih obyek.
Di sisi lain literal true
, 0
, ""
dan undefined
tidak objek. Mereka adalah nilai primitif dalam JavaScript. Namun boolean, angka dan string juga memiliki konstruktor Boolean
, Number
dan String
masing - masing yang membungkus primitif masing-masing untuk memberikan fungsionalitas tambahan:
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
Seperti yang Anda lihat ketika nilai primitif dibungkus di dalam Boolean
, Number
dan String
konstruktor masing-masing menjadi objek. The instanceof
Operator hanya bekerja untuk benda (yang mengapa ia mengembalikan false
nilai-nilai primitif):
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
Seperti yang Anda lihat keduanya typeof
dan instanceof
tidak cukup untuk menguji apakah suatu nilai adalah boolean, angka atau string - typeof
hanya berfungsi untuk boolean primitif, angka dan string; daninstanceof
tidak berfungsi untuk boolean primitif, angka, dan string.
Untungnya ada solusi sederhana untuk masalah ini. Implementasi default toString
(yaitu seperti yang didefinisikan secara bawaan Object.prototype.toString
) mengembalikan [[Class]]
properti internal dari kedua nilai primitif dan objek:
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
[[Class]]
Properti internal suatu nilai jauh lebih bermanfaat daripada typeof
nilai itu. Kita dapat menggunakan Object.prototype.toString
untuk membuat versi typeof
operator kami sendiri (lebih bermanfaat) sebagai berikut:
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
Semoga artikel ini membantu. Untuk mengetahui lebih lanjut tentang perbedaan antara primitif dan objek terbungkus, baca posting blog berikut: Kehidupan Rahasia Primitif JavaScript