Apakah ada cara yang lebih baik untuk mendapatkan jenis variabel dalam JS daripada typeof
? Ini berfungsi dengan baik ketika Anda melakukannya:
> typeof 1
"number"
> typeof "hello"
"string"
Tapi itu tidak berguna ketika Anda mencoba:
> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Saya tahu instanceof
, tapi ini mengharuskan Anda untuk mengetahui jenisnya sebelumnya.
> [1,2] instanceof Array
true
> r instanceof RegExp
true
Apakah ada cara yang lebih baik?
javascript
types
typeof
Aillyn
sumber
sumber
typeof new RegExp(/./); // "function"
masalah di Chrome tampaknya diperbaiki di Chrome 14.n
alih-alih nama asli yang diharapkan. misalnyaconstructor.name
mungkin memberi Andan
alih-alih nama lengkap yang diharapkanJawaban:
Angus Croll baru-baru ini menulis posting blog yang menarik tentang ini -
http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/
Dia melewati pro dan kontra dari berbagai metode kemudian mendefinisikan metode baru 'toType' -
sumber
ActiveXObject
Contoh Internet Explorer , misalnya.match(/\s([a-z,_,:,A-Z]+)/)
Uint8Array
. Sebaliknya, pertimbangkan yang lebih umummatch(/\s([^\]]+)/)
yang harus menangani apa pun.\w
kata operator sebagai gantinya ...Anda dapat mencoba menggunakan
constructor.name
.Seperti halnya semua JavaScript, seseorang pada akhirnya akan selalu menunjukkan bahwa ini entah bagaimana jahat, jadi di sini ada tautan ke jawaban yang mencakup hal ini dengan cukup baik.
Alternatifnya adalah menggunakan
Object.prototype.toString.call
sumber
name
adalah ekstensi untuk ECMAScript dan tidak akan berfungsi di semua browser.constructor.name
kemungkinan akan berakhir menjadi sepertin
bukan nama objek yang Anda harapkan. Jadi hati-hati untuk itu - terutama jika Anda hanya mengecil dalam produksi.null
danundefined
sayangnya tidak memiliki konstruktor.Fungsi penangkapan tipe yang cukup bagus adalah yang digunakan oleh YUI3 :
Ini menangkap banyak primitif yang disediakan oleh javascript, tetapi Anda selalu dapat menambahkan lebih banyak dengan memodifikasi
TYPES
objek. Perhatikan bahwatypeof HTMLElementCollection
di Safari akan melaporkanfunction
, tetapi ketik (HTMLElementCollection) akan kembaliobject
sumber
Anda mungkin menemukan fungsi berikut bermanfaat:
Atau di ES7 (komentar jika perbaikan lebih lanjut)
Hasil:
Terima kasih @johnrees karena memberi tahu saya tentang: kesalahan, janji, fungsi generator
sumber
typeOf(new Date())
typeOf(Promise.resolve())//promise
typeOf(function *() {})//generatorfunction
[ts] Cannot redeclare block-scoped variable 'toString'
Kita juga dapat mengubah sedikit contoh dari ipr101
dan panggil sebagai
sumber
fungsi satu baris:
ini memberikan hasil yang sama dengan
jQuery.type()
sumber
Anda dapat menerapkan
Object.prototype.toString
ke objek apa pun:Ini bekerja dengan baik di semua browser, dengan pengecualian IE - ketika memanggil ini pada variabel yang diperoleh dari jendela lain, itu hanya akan dimuntahkan
[object Object]
.sumber
2 ¢ saya! Sungguh, bagian dari alasan saya melemparkan ini di sini, meskipun daftar panjang jawaban, adalah untuk memberikan
all in one
solusi tipe yang lebih sedikit dan mendapatkan umpan balik di masa depan tentang bagaimana mengembangkannya untuk memasukkan lebih banyakreal types
.Dengan solusi berikut, seperti yang disebutkan di atas, saya menggabungkan beberapa solusi yang ditemukan di sini, serta memasukkan perbaikan untuk mengembalikan nilai jQuerypada objek yang didefinisikan pada jQuery jika tersedia . Saya juga menambahkan metode ke prototipe Object asli. Saya tahu itu sering kali tabu, karena bisa mengganggu ekstensi lain, tapi saya biarkan begitu
user beware
. Jika Anda tidak suka cara melakukannya, cukup salin fungsi basis di mana saja Anda suka dan ganti semua variabelthis
dengan parameter argumen untuk dilewatkan (seperti argumen [0]).Maka cukup gunakan dengan mudah, seperti:
Lebih banyak contoh:
Jika Anda memiliki sesuatu untuk ditambahkan yang mungkin bermanfaat, seperti mendefinisikan kapan suatu objek dibuat dengan perpustakaan lain (Moo, Proto, Yui, Dojo, dll ...) silakan berkomentar atau edit ini dan pertahankan agar lebih akurat dan tepat. ATAU berguling ke arah yang GitHubsaya buat untuk itu dan beri tahu saya. Anda juga akan menemukan tautan cepat ke file min cdn di sana.
sumber
Dalam tes pendahuluan saya, ini bekerja dengan cukup baik. Kasing pertama akan mencetak nama objek yang dibuat dengan "baru", dan kasing kedua harus menangkap yang lainnya.
Saya menggunakan
(8, -1)
karena saya berasumsi bahwa hasilnya akan selalu dimulai[object
dan diakhiri dengan]
tetapi saya tidak yakin itu benar dalam setiap skenario.sumber
Saya kira solusi paling universal di sini - adalah untuk memeriksa
undefined
dannull
pertama, lalu panggil sajaconstructor.name.toLowerCase()
.sumber
.constructor.name
selalu berisi nilai string. Untuk undefined / null kita memiliki string yang sesuai dikembalikan oleh fungsi.constructor
merupakan properti yang diwarisi, ini memecah untuk objek yang dibuat denganObject.create(null)
. Cukup sederhana untuk diperbaiki, tetapi bagaimana menyebutnya? "[objek nol]"?typeof
kondisi digunakan untuk memeriksa tipe variabel, jika Anda memeriksa tipe variabel dalam kondisi if-else misalnyasumber