Memeriksa apakah sebuah variabel dari tipe fungsi
Misalkan aku punya variabel, yang didefinisikan sebagai berikut:
var a = function() {/* Statements */};
Saya ingin fungsi yang memeriksa apakah tipe dari variabel adalah fungsi-suka. yaitu :
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Bagaimana saya bisa memeriksa apakah variabel a
adalah dari jenis Fungsi
dalam cara yang dijelaskan di atas?
816
18
Yakin menggarisbawahi's cara yang lebih efisien, tapi cara terbaik untuk memeriksa, ketika efisiensi isn't masalah, yang tertulis pada garis bawah's halaman dihubungkan oleh @Paul Rosania.
Terinspirasi oleh garis bawah, final isFunction fungsi adalah sebagai berikut:
Underscore.js menggunakan lebih rumit tapi sangat performant tes:
Lihat: http://jsperf.com/alternative-isfunction-implementations
EDIT: diperbarui tes menunjukkan bahwa typeof mungkin akan lebih cepat, lihat http://jsperf.com/alternative-isfunction-implementations/4
Ada beberapa cara agar saya akan meringkas mereka semua
jenis
adalah bahwa hal itu lebih rentan untuk diam kegagalan, buruk, jadi jika anda memiliki kesalahan ketik (misalnya "finction") - dalam hal ini `jika` hanya akan kembali palsu dan anda tidak't tahu anda memiliki kesalahan sampai kemudian dalam kode andatapi masih banyak yang kurang semantik dari solusi #1
jQuery (sudah ditinggalkan sejak versi 3.3) Referensi
AngularJS Referensi
Lodash Referensi
Menggarisbawahi Referensi
Node.js tak berlaku lagi sejak v4.0.0 Referensi
@grandecomplex: Ada's cukup bertele-tele untuk solusi anda. Itu akan menjadi lebih jelas jika ditulis seperti ini:
Mencoba
instanceof
operator: tampaknya bahwa semua fungsi mewarisi dariFungsi
kelas:Sesuatu dengan lebih banyak dukungan browser dan juga mencakup async fungsi bisa:
dan kemudian mengujinya seperti:
Yang lain cukup dengan cara:
Bagi mereka yang's tertarik pada gaya fungsional, atau terlihat lebih ekspresif pendekatan untuk memanfaatkan dalam meta pemrograman (seperti jenis pemeriksaan), itu bisa menjadi menarik untuk melihat Ramda perpustakaan untuk menyelesaikan tugas tersebut.
Berikutnya kode hanya berisi murni dan pointfree fungsi:
Sebagai ES2017,
async
fungsi yang tersedia, sehingga kita dapat memeriksa terhadap mereka serta:Dan kemudian menggabungkan mereka bersama-sama:
Tentu saja, fungsi harus dilindungi terhadap
null
danundefined
nilai-nilai, sehingga untuk membuat "aman":Dan, lengkap cuplikan singkatnya:
Namun, catatan larutan ini bisa menunjukkan kinerja kurang dari pilihan lain yang tersedia karena penggunaan yang luas dari tingkat tinggi fungsi.
Jika anda menggunakan Lodash anda dapat melakukannya dengan _.isFunction.
Metode ini mengembalikan
true
jika nilai adalah fungsi, yang lainpalsu
.Di bawah ini tampaknya bekerja untuk saya juga (diuji dari
node.js
):Saya menemukan bahwa ketika pengujian browser asli fungsi di IE8, menggunakan
toString
,instanceof
, danjenis
tidak bekerja. Berikut ini adalah metode yang bekerja dengan baik di IE8 (sejauh yang saya tahu):Atau, anda dapat memeriksa untuk fungsi asli menggunakan:
Meskipun, saya telah membaca di suatu tempat bahwa ini tidak akan selalu bekerja di IE7 dan di bawah ini.
Saya pikir anda hanya dapat menentukan bendera pada prototipe Fungsi dan memeriksa jika misalnya anda ingin menguji warisan yang
menetapkan bendera:
dan kemudian memeriksa jika ada
The downside adalah bahwa lain prototipe dapat menentukan bendera yang sama dan kemudian's tidak berharga, tetapi jika anda memiliki kontrol penuh atas termasuk modul ini adalah cara termudah
Sejak node v0.11 anda dapat menggunakan standar util fungsi :
anda harus menggunakan
jenis
operator di js.Solusi seperti beberapa jawaban sebelumnya telah menunjukkan adalah dengan menggunakan typeof. berikut adalah potongan kode Di NodeJs,