Rumah hujung hadapan web tutorial js Prinsip kaedah Object.prototype.toString dalam kemahiran JavaScript_javascript

Prinsip kaedah Object.prototype.toString dalam kemahiran JavaScript_javascript

May 16, 2016 pm 03:13 PM

Dalam JavaScript, cara yang paling boleh dipercayai untuk menentukan jenis terbina dalam nilai objek adalah melalui kaedah Object.prototype.toString.

var arr = [];
console.log(Object.prototype.toString.call(arr)) //"[object Array]"
Salin selepas log masuk

Apa yang akan dibincangkan oleh artikel ini ialah cara kaedah toString melakukan ini dan apakah prinsipnya.

ECMAScript 3

Dalam ES3, spesifikasi kaedah Object.prototype.toString adalah seperti berikut:

15.2.4.2 Object.prototype.toString()
Salin selepas log masuk

Apabila kaedah toString dipanggil, langkah berikut akan dilakukan:

1. Dapatkan nilai atribut [[Kelas]] objek ini.

2. Kira tiga rentetan "[objek", hasil operasi Hasil(1) langkah pertama dan rentetan baharu selepas gabungan "]".

3. Kembalikan hasil operasi langkah kedua Keputusan(2).

[[Kelas]] ialah sifat dalaman yang dimiliki oleh semua objek (objek asli dan objek hos) Dalam spesifikasi, [[Kelas]] ditakrifkan seperti ini

内部属性 描述
[[Class]] 一个字符串值,表明了该对象的类型.
<🎜>Sifat dalaman<🎜> <🎜>Penerangan<🎜> <🎜> <🎜> <🎜> Nilai rentetan yang menunjukkan jenis objek. <🎜>

Kemudian dia memberi penjelasan:

Nilai atribut [[Class]] bagi semua objek terbina dalam ditakrifkan oleh spesifikasi ini Nilai atribut [[Class]] bagi semua objek hos boleh menjadi sebarang nilai, malah [[Class]. digunakan oleh atribut objek terbina dalam ] Nilai atribut [[Class]] boleh digunakan untuk menentukan jenis terbina dalam milik objek asli. Perlu diingatkan bahawa spesifikasi ini tidak menyediakan sebarang cara lain kecuali melalui kaedah Object.prototype.toString. Biarkan program mengakses nilai harta (lihat 15.2.4.2).

Dalam erti kata lain, rentetan yang dikembalikan oleh kaedah Object.prototype.toString, alih keluar "[objek" tetap di hadapan dan "]" tetap di belakang, ialah nilai atribut dalaman [[class] ], yang dicapai Tujuan menentukan jenis objek Kaedah alat $.type() dalam jQuery digunakan untuk ini

Dalam ES3, dokumen spesifikasi tidak meringkaskan berapa banyak jenis sifat dalaman [[kelas]] yang ada, tetapi kita boleh mengira sendiri Terdapat sejumlah 10 nilai [[kelas]. ] sifat dalaman objek asli masing-masing ialah: "Array", "Boolean", "Date", "Error", "Function", "Math", "Nombor", "Objek", "RegExp", "String" .

ECMAScript 5

Dalam ES5.1, selain spesifikasi ditulis dengan lebih terperinci, terdapat juga beberapa perubahan dalam takrifan kaedah Object.prototype.toString dan sifat dalaman [[class]]. kaedah prototype.toString adalah seperti berikut:

15.2.4.2 Object.prototype.toString ( )

Apabila kaedah toString dipanggil, langkah berikut akan dilakukan:

Jika nilai ini tidak ditentukan, kembalikan "[objek Tidak Ditakrifkan]".


Jika nilai ini adalah nol, kembalikan "[objek Null]".


Biar O menjadi hasil daripada memanggil ToObject(this).


Biar kelas sebagai nilai sifat dalaman O [[Kelas]].


Mengembalikan rentetan baharu selepas menggabungkan tiga rentetan "[objek ", kelas dan "]".


Dapat dilihat bahawa terdapat 1, 2, dan 3 lagi langkah daripada ES3 Langkah 1 dan 2 adalah peraturan baru dan agak istimewa, kerana "Undefined" dan "Null" tidak tergolong dalam nilai-nilai. atribut [[class]]. Perlu diingatkan bahawa ini tiada kaitan dengan mod ketat (untuk kebanyakan fungsi, nilai ini akan kekal tidak ditentukan atau batal hanya dalam mod ketat, dan secara automatik akan menjadi objek global dalam bukan- mod ketat). Langkah 3 bukanlah peraturan baru, kerana Dalam enjin ES3, tiga jenis nilai primitif akan ditukar kepada objek pembungkusan yang sepadan dalam langkah ini, tetapi ia tidak ditulis dalam spesifikasi [[Class atribut ]] dijelaskan dengan lebih terperinci:

Nilai atribut [[Class]] bagi semua objek terbina dalam ditakrifkan oleh spesifikasi ini Nilai atribut [[Class]] bagi semua objek hos boleh kecuali "Arguments", "Array", "Boolean", "Tarikh ", "Ralat", "Fungsi", "JSON", "Math", "Nombor", "Objek", "RegExp", "String" ialah enjin yang digunakan secara Dalaman untuk menentukan jenis nilai yang dimiliki objek. Perlu diingat bahawa spesifikasi ini tidak menyediakan cara lain untuk program mengakses nilai harta ini kecuali melalui kaedah Object.prototype.toString (lihat 15.2.4.2).

Berbanding dengan ES3, perbezaan pertama ialah [[class]] mempunyai dua lagi nilai atribut dalaman, menjadi 12 jenis Satu ialah [[class]] objek argumen menjadi "Argumen", dan Daripada yang sebelumnya "Objek", terdapat berbilang objek global JSON, yang nilai [[kelas]]nya ialah "JSON". Perbezaan kedua ialah nilai harta dalaman [[kelas]] objek hos tidak boleh Ia bercanggah dengan 12 ini nilai, tetapi dalam penyemak imbas yang menyokong ES3, nampaknya tiada objek hos yang sengaja menggunakan 10 nilai tersebut

ECMAScript 6 ES6 masih hanya draf yang berfungsi, tetapi yang pasti atribut dalaman [[class]] hilang dan digantikan dengan atribut dalaman yang lain [[NativeBrand]]. :

内部属性 属性值 描述
[[NativeBrand]] 枚举NativeBrand的一个成员. 该属性的值对应一个标志值(tag value),可以用来区分原生对象的类型.

[[NativeBrand]] penjelasan atribut:

[[NativeBrand]] sifat dalaman digunakan untuk mengenal pasti sama ada objek asli ialah jenis objek tertentu yang mematuhi spesifikasi ini Nilai sifat dalaman [[NativeBrand]] ialah salah satu nilai jenis penghitungan berikut A: NativeFunction, NativeArray, StringWrapper, BooleanWrapper, NumberWrapper, NativeMath, NativeDate, NativeRegExp, NativeError, NativeJSON, NativeArguments, NativePrivateName hanya jenis dalaman ScriptMAish yang khusus digunakan untuk membezakan Jadual 10 Hanya jenis objek yang dinyatakan secara eksplisit mempunyai sifat dalaman [[NativeBrand]].

Jadual 10 — Nilai sifat dalaman [[NativeBrand]]

属性值 对应类型
NativeFunction Objek fungsi
NativeArray Objek tatasusunan
Pembungkus Rentetan Rentetan objek
BooleanWrapper Objek Boolean
NumberWrapper Nombor objek
NativeMath Objek Matematik
Tarikh Asli Objek tarikh
NativeRegExp objek RegExp
NativeError Ralat objek
NativeJSON Objek JSON
Argumen Asli Objek hujah
NativePrivateName Objek Nama Peribadi

Ia boleh dilihat bahawa, tidak seperti [[kelas]], tidak setiap objek mempunyai [[NativeBrand]]. Pada masa yang sama, spesifikasi kaedah Object.prototype.toString juga telah ditukar kepada yang berikut:

15.2.4.2 Object.prototype.toString ( )

Apabila kaedah toString dipanggil, langkah berikut akan dilakukan:

Jika nilai ini tidak ditentukan, kembalikan "[objek Tidak Ditakrifkan]".

Jika nilai ini adalah nol, kembalikan "[objek Null]".

Biar O menjadi hasil daripada memanggil ToObject(this).

Jika O mempunyai atribut dalaman [[NativeBrand]], biarkan teg menjadi nilai yang sepadan dalam Jadual 29.

Jika tidak

Biar hasTag menjadi hasil daripada memanggil kaedah dalaman [[HasProperty]] O, dengan parameter @@toStringTag.

Jika hasTag palsu, biarkan teg itu "Objek".

Jika tidak,

Biar teg sebagai hasil daripada memanggil kaedah dalaman [[Get]] O dan parameternya ialah @@toStringTag.

Jika teg adalah penyiapan mendadak, biarkan teg menjadi NormalCompletion("???").

Biar teg menjadi teg.[[nilai]].

Jika Jenis(teg) bukan rentetan, biarkan teg menjadi "???".

Jika nilai teg ialah "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Nombor", "Object", " RegExp ", atau

atau "String", kemudian biarkan teg menjadi hasil penggabungan rentetan "~" dan nilai semasa teg.

Mengembalikan rentetan baharu selepas menggabungkan tiga rentetan "[objek ", teg dan "]".

Jadual 29 — [[NativeBrand]] Nilai Bendera

Valeur [[NativeBrand]] Valeur du drapeau
FonctionNative <font face="NSimsun">"Function"</font>
NativeArray <font face="NSimsun">"Array"</font>
StringWrapper <font face="NSimsun">"String"</font>
BooleanWrapper <font face="NSimsun">"Boolean"</font>
NumberWrapper <font face="NSimsun">"Number"</font>
NativeMath <font face="NSimsun">"Math"</font>
Tarikh Asli <font face="NSimsun">"Date"</font>
NativeRegExp <font face="NSimsun">"RegExp"</font>
NativeError <font face="NSimsun">"Error"</font>
NativeJSON <font face="NSimsun">"JSON"</font>
NativeArguments <font face="NSimsun">"Arguments"</font>

可以看到,在规范上有了很大的变化,不过对于普通用户来说,貌似感觉不到.

也许你发现了,ES6里的新类型Map,Set等,都没有在表29中.它们在执行toString方法的时候返回的是什么?

console.log(Object.prototype.toString.call(Map())) //"[object Map]"
console.log(Object.prototype.toString.call(Set())) //"[object Set]"
Salin selepas log masuk

其中的字符串"Map"是怎么来的呢:

15.14.5.13 Map.prototype.@@toStringTag

@@toStringTag 属性的初始值为字符串"Map".

由于ES6的规范还在制定中,各种相关规定都有可能改变,所以如果想了解更多细节.看看下面这两个链接,现在只需要知道的是:[[class]]没了,使用了更复杂的机制.

以上所述是小编给大家分享的JavaScript中Object.prototype.toString方法的原理,希望对大家有所帮助!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Muzium Dua Point: Semua Pameran dan Di Mana Mencari Mereka
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Ganti aksara rentetan dalam javascript Ganti aksara rentetan dalam javascript Mar 11, 2025 am 12:07 AM

Penjelasan terperinci mengenai kaedah penggantian rentetan javascript dan Soalan Lazim Artikel ini akan meneroka dua cara untuk menggantikan watak rentetan dalam JavaScript: Kod JavaScript dalaman dan HTML dalaman untuk laman web. Ganti rentetan di dalam kod JavaScript Cara yang paling langsung ialah menggunakan kaedah pengganti (): str = str.replace ("cari", "ganti"); Kaedah ini hanya menggantikan perlawanan pertama. Untuk menggantikan semua perlawanan, gunakan ungkapan biasa dan tambahkan bendera global g: str = str.replace (/fi

8 plugin susun atur halaman jquery yang menakjubkan 8 plugin susun atur halaman jquery yang menakjubkan Mar 06, 2025 am 12:48 AM

Leverage JQuery untuk Layouts Laman Web yang mudah: 8 Plugin Essential JQuery memudahkan susun atur laman web dengan ketara. Artikel ini menyoroti lapan plugin jQuery yang kuat yang menyelaraskan proses, terutamanya berguna untuk penciptaan laman web manual

Bina Aplikasi Web Ajax anda sendiri Bina Aplikasi Web Ajax anda sendiri Mar 09, 2025 am 12:11 AM

Jadi di sini anda, bersedia untuk mempelajari semua perkara ini yang dipanggil Ajax. Tetapi, apa sebenarnya? Istilah Ajax merujuk kepada kumpulan teknologi longgar yang digunakan untuk membuat kandungan web yang dinamik dan interaktif. Istilah Ajax, yang asalnya dicipta oleh Jesse J

10 helaian cheat mudah alih untuk pembangunan mudah alih 10 helaian cheat mudah alih untuk pembangunan mudah alih Mar 05, 2025 am 12:43 AM

Siaran ini menyusun helaian cheat berguna, panduan rujukan, resipi cepat, dan coretan kod untuk perkembangan aplikasi Android, BlackBerry, dan iPhone. Tiada pemaju harus tanpa mereka! Panduan Rujukan Gesture Touch (PDF) Sumber yang berharga untuk desig

Tingkatkan pengetahuan jQuery anda dengan penonton sumber Tingkatkan pengetahuan jQuery anda dengan penonton sumber Mar 05, 2025 am 12:54 AM

JQuery adalah rangka kerja JavaScript yang hebat. Walau bagaimanapun, seperti mana -mana perpustakaan, kadang -kadang perlu untuk mendapatkan di bawah tudung untuk mengetahui apa yang sedang berlaku. Mungkin kerana anda mengesan bug atau hanya ingin tahu tentang bagaimana jQuery mencapai UI tertentu

Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Mar 18, 2025 pm 03:12 PM

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

10 JQuery Fun and Games Plugin 10 JQuery Fun and Games Plugin Mar 08, 2025 am 12:42 AM

10 Plugin Permainan JQuery yang menyeronokkan untuk menjadikan laman web anda lebih menarik dan meningkatkan keletihan pengguna! Walaupun Flash masih merupakan perisian terbaik untuk membangunkan permainan web kasual, jQuery juga boleh menghasilkan kesan yang mengejutkan, dan walaupun tidak setanding dengan permainan flash aksi tulen, dalam beberapa kes, anda juga boleh bersenang -senang di penyemak imbas anda. permainan jquery tic toe "Hello World" pengaturcaraan permainan kini mempunyai versi jQuery. Kod sumber JQuery Game Composition Crazy Word Ini adalah permainan mengisi kosong, dan ia dapat menghasilkan beberapa hasil yang pelik kerana tidak mengetahui konteks perkataan. Kod sumber JQuery Mine Sweeping Game

JQuery Parallax Tutorial - Latar Belakang Header Animasi JQuery Parallax Tutorial - Latar Belakang Header Animasi Mar 08, 2025 am 12:39 AM

Tutorial ini menunjukkan cara membuat kesan latar belakang paralaks yang menawan menggunakan jQuery. Kami akan membina sepanduk header dengan imej berlapis yang mewujudkan kedalaman visual yang menakjubkan. Plugin yang dikemas kini berfungsi dengan JQuery 1.6.4 dan kemudian. Muat turun

See all articles