Misalkan saya punya variabel apa pun, yang didefinisikan sebagai berikut:
var a = function() {/* Statements */};
Saya ingin fungsi yang memeriksa apakah jenis variabel seperti fungsi. yaitu:
function foo(v) {if (v is function type?) {/* do something */}};
foo(a);
Bagaimana saya bisa mengecek apakah variabelnya a
bertipe Function
dengan cara yang didefinisikan di atas?
javascript
Jesufer Vn
sumber
sumber
Jawaban:
Cara underscore memang lebih efisien, tetapi cara terbaik untuk memeriksa, ketika efisiensi bukan masalah, ditulis di halaman underscore yang ditautkan oleh @Paul Rosania.
Terinspirasi oleh garis bawah, fungsi isfungsi terakhir adalah sebagai berikut:
sumber
isFunctionA
menunjukkan perbedaan implementasi dibandingkan dengan metode lain.typeof(obj) === 'function'
tampaknya menjadi yang tercepat; namun, di Firefoxobj instanceof Function
adalah pemenangnya.sumber
typeof Object
,typeof Date
, dantypeof String
, yang semua kembali'function'
juga.if (v instanceOf Function)
?instanceof
tidak akan berfungsi jika Anda memeriksa fungsi yang berasal dari dokumen lain (iframe, mungkin). Performanya beragam.asyncfunctionToCheck
, digetType.toString.call(functionToCheck)==='[object AsyncFunction]'
manatypeof asyncfunctionToCheck === 'function'
Underscore.js menggunakan tes yang lebih rumit tetapi berkinerja tinggi:
Lihat: http://jsperf.com/alternative-isfunction-implementations
EDIT: tes yang diperbarui menunjukkan bahwa typeof mungkin lebih cepat, lihat http://jsperf.com/alternative-isfunction-implementations/4
sumber
typof
?typeof == "function"
) - dan tampaknya jauh lebih cepat daripada versi "cepat" Underscore.isFunction()
implementasi alternatif . Saat ini menggunakan sesuatu yang sangat dekat dengan apa yang disarankan dandean .Ada beberapa cara jadi saya akan merangkum semuanya
typeof
adalah bahwa ia rentan terhadap kegagalan diam, buruk, jadi jika Anda memiliki kesalahan ketik (misalnya "fiksi") - dalam hal ini `jika` hanya akan mengembalikan false dan Anda tidak akan tahu Anda memiliki kesalahan sampai nanti di kode Andasumber
top.Function !== Function
. Yang pasti, gunakan yang kedua (kesalahan ejaan "fungsi" akan diperbaiki selama debug, semoga).instanceof
tidak memperhitungkan banyak global, seperti pemeriksaan lintas bingkai, dan dapat mengembalikan negatif palsu.jQuery (sudah tidak digunakan lagi sejak versi 3.3) Referensi
Referensi AngularJS
Referensi Lodash
Referensi Garis Bawah
Node.js sudah tidak digunakan lagi sejak Referensi v4.0.0
sumber
@grandecomplex: Ada cukup banyak verbositas untuk solusi Anda. Akan jauh lebih jelas jika ditulis seperti ini:
sumber
sumber
(() => (typeof obj === 'function') && doSomething())
masih opsi tercepat.Coba
instanceof
operator: sepertinya semua fungsi mewarisi dariFunction
kelas:sumber
Sesuatu dengan lebih banyak dukungan browser dan juga menyertakan fungsi async dapat berupa:
dan kemudian mengujinya seperti:
sumber
Cara sederhana lainnya:
sumber
fn && fn.constructor === Function
bagaimana dengan ini?Bagi mereka yang tertarik dengan gaya fungsional, atau mencari pendekatan yang lebih ekspresif untuk digunakan dalam pemrograman meta (seperti pengecekan jenis), mungkin menarik untuk melihat Ramda. perpustakaan untuk menyelesaikan tugas tersebut.
Kode selanjutnya hanya berisi fungsi murni dan pointfree:
Pada ES2017,
async
fungsi tersedia, sehingga kami juga dapat memeriksanya:Dan kemudian menggabungkannya:
Tentu saja, fungsi harus dilindungi
null
danundefined
bernilai, sehingga membuatnya "aman":Dan, lengkapi cuplikan untuk menyimpulkan:
Namun, perhatikan bahwa solusi ini dapat menunjukkan kinerja yang lebih rendah daripada opsi lain yang tersedia karena penggunaan fungsi-fungsi tingkat tinggi yang ekstensif.
sumber
Jika Anda menggunakan Lodash, Anda dapat melakukannya dengan _.isFunction .
Metode ini mengembalikan
true
jika nilai adalah fungsi, yang lainfalse
.sumber
Saya menemukan bahwa ketika pengujian fungsi browser asli di IE8, menggunakan
toString
,instanceof
dantypeof
tidak bekerja. Berikut adalah metode yang berfungsi dengan baik di IE8 (sejauh yang saya tahu):Atau, Anda dapat memeriksa fungsi-fungsi asli menggunakan:
Padahal, saya telah membaca di suatu tempat bahwa ini tidak akan selalu berfungsi di IE7 dan di bawah.
sumber
Di bawah ini tampaknya bekerja untuk saya juga (diuji dari
node.js
):sumber
Saya pikir Anda bisa mendefinisikan flag pada Function prototype dan memeriksa apakah instance yang ingin Anda uji mewarisinya
tentukan bendera:
dan kemudian periksa apakah ada
Kelemahannya adalah bahwa prototipe lain dapat menentukan flag yang sama dan kemudian itu tidak berharga, tetapi jika Anda memiliki kontrol penuh atas modul yang disertakan itu adalah cara termudah
sumber
Sejak node v0.11 Anda dapat menggunakan fungsi util standar:
sumber
Anda harus menggunakan
typeOf
operator di js.sumber
Solusi seperti yang ditunjukkan beberapa jawaban sebelumnya adalah menggunakan typeof. berikut ini adalah cuplikan kode Di NodeJs,
sumber