Dasar-dasar
Anda mungkin tidak mengetahuinya tetapi, dalam JavaScript, setiap kali kita berinteraksi dengan string, angka, atau boolean primitif, kita memasuki dunia tersembunyi dari bayangan dan pemaksaan objek.
string, number, boolean, null, undefined, dan simbol.
Dalam JavaScript ada 7 tipe primitif: undefined, null, boolean, string, number, bigintdan symbol. Segala sesuatu yang lain adalah sebuah objek. Tipe primitif boolean, stringdan numberbisa dibungkus oleh rekan objeknya. Objek-objek ini masing-masing adalah instance dari Boolean, Stringdan Numberkonstruktor.
typeof true; //"boolean"
typeof new Boolean(true); //"object"
typeof "this is a string"; //"string"
typeof new String("this is a string"); //"object"
typeof 123; //"number"
typeof new Number(123); //"object"
Jika primitif tidak memiliki properti, mengapa "this is a string".lengthmengembalikan nilai?
Karena JavaScript akan dengan mudah memaksa antara primitif dan objek. Dalam hal ini nilai string dipaksa ke objek string untuk mengakses panjang properti. Objek string hanya digunakan sepersekian detik setelah itu dikorbankan untuk Dewa pengumpulan sampah - tetapi dalam semangat acara penemuan TV, kami akan menjebak makhluk yang sulit dipahami dan melestarikannya untuk analisis lebih lanjut ...
Untuk mendemonstrasikan hal ini lebih lanjut pertimbangkan contoh berikut di mana kita menambahkan properti baru ke prototipe konstruktor String.
String.prototype.sampleProperty = 5;
var str = "this is a string";
str.sampleProperty; // 5
Dengan cara ini, primitif memiliki akses ke semua properti (termasuk metode) yang ditentukan oleh konstruktor objeknya masing-masing.
Jadi kita melihat bahwa tipe primitif akan dengan tepat memaksa ke rekan Object masing-masing saat diperlukan.
Analisis toString()metode
Perhatikan kode berikut
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
myObj.toString(); // "[object Object]"
myFunc.toString(); // "function(){}"
myString.toString(); // "This is a sample String"
myNumber.toString(); // "4"
myArray.toString(); // "2,3,5"
Seperti dibahas di atas, apa yang sebenarnya terjadi adalah ketika kita memanggil toString()metode pada tipe primitif, itu harus dipaksakan ke pasangan objeknya sebelum bisa memanggil metode.
yaitu myNumber.toString()setara dengan Number.prototype.toString.call(myNumber)dan serupa untuk tipe primitif lainnya.
Tetapi bagaimana jika alih-alih tipe primitif yang diteruskan ke toString()metode mitra fungsi konstruktor Objek yang sesuai, kita memaksa tipe primitif untuk diteruskan sebagai parameter ke toString()metode konstruktor fungsi Objek ( Object.prototype.toString.call(x))?
Melihat lebih dekat ke Object.prototype.toString ()
Sesuai dokumentasi , Ketika metode toString dipanggil, langkah-langkah berikut diambil:
- Jika
thisnilainya adalah undefined, kembalikan "[object Undefined]".
- Jika
thisnilainya adalah null, kembalikan "[object Null]".
- Jika nilai ini tidak ada di atas, Membiarkan
Omenjadi hasil dari panggilan toObjectmelewati thisnilai sebagai argumen.
- Biarkan kelas menjadi nilai
[[Class]]properti internal O.
- Mengembalikan nilai String yang merupakan hasil dari concatenating tiga Strings
"[object ", classdan "]".
Pahami ini dari contoh berikut
var myObj = {lhs: 3, rhs: 2};
var myFunc = function(){}
var myString = "This is a sample String";
var myNumber = 4;
var myArray = [2, 3, 5];
var myUndefined = undefined;
var myNull = null;
Object.prototype.toString.call(myObj); // "[object Object]"
Object.prototype.toString.call(myFunc); // "[object Function]"
Object.prototype.toString.call(myString); // "[object String]"
Object.prototype.toString.call(myNumber); // "[object Number]"
Object.prototype.toString.call(myArray); // "[object Array]"
Object.prototype.toString.call(myUndefined); // "[object Undefined]"
Object.prototype.toString.call(myNull); // "[object Null]"
Referensi:
https://es5.github.io/x15.2.html#x15.2.4.2
https://es5.github.io/x9.html#x9.9
https://javascriptweblog.wordpress.com/ 2010/09/27 / the-secret-life-of-javascript-primitives /