Apa konvensi JavaScript untuk tanpa operasi? Seperti pass
perintah Python .
- Salah satu opsi hanyalah fungsi kosong:
function() {}
- jQuery menawarkan
$.noop()
, yang hanya memanggil fungsi kosong di atas. - Apakah dapat diterima untuk memasukkan nilai
false
atau0
?
Dalam konteks ... semua ini bekerja tanpa menimbulkan kesalahan di Chrome:
var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;
EDIT: Banyak orang menjawab dengan, "jangan lakukan ini! Ubah struktur kode!" Ini mengingatkan saya pada postingan di mana seseorang bertanya bagaimana cara mengendus browser. Dia menerima rentetan postingan yang mengatakan, "JANGAN LAKUKAN! ITU JAHAT," tetapi tidak ada yang memberitahunya cara mengendus browser . Ini bukan review kode. Bayangkan Anda berurusan dengan kode lama yang tidak dapat diubah, dan tanpa beberapa fungsi yang diteruskan, itu akan menimbulkan kesalahan. Atau, sederhananya, itulah yang diinginkan pelanggan, dan mereka membayar saya . Jadi, dengan hormat, harap jawab pertanyaan : Apa cara terbaik untuk menentukan fungsi "tanpa operasi" di JavaScript?
EDIT2: Bagaimana dengan salah satunya?
true;
false;
0;
1;
null;
sumber
0
tersebut yang secara efektif lebih baik (atau lebih buruk). Saya akan mengatakan hal yang benar untuk dilakukan adalahif (a === 1) doSomething();
dan tidak menggunakan? :
saat itu tidak masuk akal.if (statement) action; else ;
false
atau0
akan berhasil;null
adalah cara yang bagus untuk mengekspresikan no-op.Jawaban:
Untuk menjawab pertanyaan awal, implementasi fungsi noop yang paling elegan dan rapi dalam Javascript murni (seperti yang juga dibahas di sini ) adalah Function.prototype . Hal ini karena:
Meskipun ini adalah "noop sejati" karena sebagian besar browser tampaknya tidak melakukan apa pun untuk menjalankan noop yang didefinisikan dengan cara ini (dan karenanya menghemat siklus CPU), mungkin ada beberapa masalah kinerja yang terkait dengan ini (seperti yang juga disebutkan oleh orang lain di komentar atau di jawaban lain).
Namun, karena itu, Anda dapat dengan mudah menentukan fungsi noop Anda sendiri dan, faktanya, banyak pustaka dan kerangka kerja juga menyediakan fungsi noop. Berikut ini beberapa contohnya:
Berikut adalah daftar alfabet dari berbagai implementasi fungsi noop (atau diskusi terkait atau pencarian google):
AngularJS 1.x , Angular 2+ (Tampaknya tidak memiliki implementasi asli - gunakan milik Anda sendiri seperti yang ditunjukkan di atas), Ember , jQuery , Lodash , NodeJS , Ramda , React (Tampaknya tidak memiliki implementasi asli - gunakan milik Anda sendiri seperti yang ditunjukkan di atas), RxJS , Underscore
BAWAH BARIS : Meskipun Function.prototype adalah cara elegan untuk mengekspresikan noop dalam Javascript, namun, mungkin ada beberapa masalah kinerja terkait dengan penggunaannya. Jadi, Anda dapat menentukan dan menggunakan milik Anda sendiri (seperti yang ditunjukkan di atas) atau menggunakan yang ditentukan oleh pustaka / kerangka kerja yang mungkin Anda gunakan dalam kode Anda.
sumber
Function.prototype()
jika Anda tidak memerlukan waktu tunggu dan ingin segera mengeksekusinya.setTimeout(Function(), 10000);
(( )=>{};)
teknis Pure JS dan jauh lebih pendek darifunction () {}
tapi sama persis.Yang paling ringkas dan noop performant merupakan fungsi panah kosong :
()=>{}
.Fungsi panah bekerja secara native di semua browser kecuali IE (ada transformasi babel jika Anda harus):
()=>{}
vs.Function.Prototype
()=>{}
adalah 87% lebih cepat dibandingkanFunction.prototype
di Chrome 67.()=>{}
adalah 25% lebih cepat daripadaFunction.prototype
di Firefox 60.()=>{}
adalah 85% lebih cepat dibandingkanFunction.prototype
di Ujung (2018/06/15) .()=>{}
adalah kode 65% lebih sedikit dariFunction.prototype
.Tes di bawah ini memanas menggunakan fungsi panah untuk memberikan bias
Function.prototype
, namun fungsi panah adalah pemenangnya:sumber
Function.prototype
lebih lambat, tetapi tidak ada opsi lain yang memiliki keuntungan pasti._=>{}
adalah satu karakter kurang dan melakukan hal yang sama._=>{}
memiliki satu parameter. Jika seseorang menggunakan TypeScript dengan konfigurasi yang cukup ketat, itu tidak akan dapat dikompilasi. Jika Anda menyebutnya, IDE Anda kemungkinan akan memberi tahu Anda bahwa ia menerima satu parameter yang bisa dari jenis apa pun (baik JavaScript dan terutama TypeScript di vscode).apa pun yang cenderung Anda capai di sini salah. Ekspresi terner tidak boleh digunakan sebagai pernyataan lengkap, hanya dalam ekspresi, jadi jawaban atas pertanyaan Anda adalah:
tidak ada saran Anda, sebaliknya lakukan:
maka kode tersebut mudah dimengerti, dapat dibaca, dan seefisien mungkin.
Mengapa membuatnya lebih sulit, padahal bisa jadi sederhana?
edit:
Anda kehilangan maksud saya. Semua hal di atas adalah tentang ekspresi terner
x ? y : z
.Tetapi, perintah tanpa operasi tidak masuk akal dalam bahasa tingkat yang lebih tinggi seperti Javascript.
Ini biasanya digunakan, dalam bahasa tingkat yang lebih rendah seperti assembly atau C, sebagai cara untuk membuat prosesor tidak melakukan apa pun untuk satu instruksi untuk tujuan pengaturan waktu.
Di JS, apakah Anda melakukan
0;
,null;
,function () {};
atau pernyataan kosong, ada kemungkinan besar bahwa itu akan diabaikan oleh interpretor ketika membaca, tapi sebelum itu akan ditafsirkan, sehingga pada akhirnya, Anda hanya akan membuat program anda menjadi dimuat lebih lambat dengan waktu yang sangat singkat. Nota Bene : Saya berasumsi demikian, karena saya tidak terlibat dalam interpreter JS yang banyak digunakan, dan ada kemungkinan setiap interpreter memiliki strateginya sendiri.Jika Anda menggunakan sesuatu yang sedikit lebih rumit, seperti
$.noop()
atauvar foo = function () {}; foo()
, maka interpreter dapat melakukan panggilan fungsi yang tidak berguna yang pada akhirnya akan merusak beberapa byte tumpukan fungsi Anda, dan beberapa siklus.Satu-satunya alasan saya melihat fungsi seperti
$.noop()
akan ada, adalah masih bisa memberikan fungsi callback ke beberapa fungsi event yang akan memunculkan pengecualian jika tidak bisa memanggil callback itu. Tapi kemudian, itu perlu fungsi yang perlu Anda berikan, dan memberinyanoop
nama adalah ide yang bagus sehingga Anda memberi tahu pembaca Anda (dan itu mungkin Anda dalam 6 bulan) bahwa Anda sengaja memberikan fungsi kosong.Pada akhirnya, tidak ada yang namanya struktur kode "inferior" atau "superior". Anda benar atau salah dalam cara Anda menggunakan perkakas .. Menggunakan terner sebagai contoh Anda seperti menggunakan palu saat Anda ingin memasang sekrup. Ini akan berhasil, tetapi Anda tidak yakin Anda dapat menggantung sesuatu di sekrup itu.
Apa yang dapat dianggap sebagai "inferior" atau "superior" adalah algoritme dan ide yang Anda masukkan ke dalam kode. Tapi itu hal lain.
sumber
Saya pikir jQuery
noop()
sebagian besar dimaksudkan untuk mencegah kode mogok dengan menyediakan fungsi default ketika yang diminta tidak tersedia. Misalnya, dengan mempertimbangkan contoh kode berikut,$.noop
dipilih jikafakeFunction
tidak ditentukan, mencegah panggilan berikutnya ke tidak bekerjafn
:Kemudian,
noop()
izinkan untuk menghemat memori dengan menghindari menulis fungsi kosong yang sama beberapa kali di mana pun dalam kode Anda. Ngomong-ngomong,$.noop
ini sedikit lebih pendek darifunction(){}
(6 byte disimpan per token). Jadi, tidak ada hubungan antara kode Anda dan pola fungsi kosong. Gunakannull
,false
atau0
jika Anda suka, dalam kasus Anda tidak akan ada efek samping. Selain itu, perlu dicatat bahwa kode ini ...... sama sekali tidak berguna karena Anda tidak akan pernah memanggil fungsinya, dan yang ini ...
... bahkan lebih tidak berguna karena Anda memanggil fungsi kosong, yang persis sama dengan ...
Mari kita ganti ekspresi terner dengan
if
pernyataan untuk melihat seberapa tidak berguna:Anda cukup menulis:
Atau bahkan lebih pendek:
Untuk akhirnya menjawab pertanyaan Anda, saya kira "tidak ada operasi konvensional" adalah yang tidak pernah ditulis.
sumber
mypromise.then($.noop, myErrorhandler);
Saya menggunakan:
Untuk menguji waktu eksekusi, jalankan sebagai:
hasil: tandai: 0.000ms
Menggunakan
Boolean( 10 > 9)
dapat direduksi menjadi( 10 > 9)
yang kembalitrue
. Datang dengan ide untuk menggunakan satu operan, saya sepenuhnya berharap(0);
akan kembalifalse
, tetapi itu hanya mengembalikan argumen kembali seperti yang dapat ditinjau dengan melakukan tes ini di konsol.sumber
argument 0 is not a function
noop
harus menjadi fungsi yang mengevaluasiundefined
hasil.function(){}
sebagai solusi. Menelepon(0)()
akan menyebabkanTypeError: 0 is not a function
var a = (0);
. Tidak ada operasi seharusnya tidak mengubah memori dan contoh tugas Anda melakukan hal itu. Itu(0)
sendiri dapat dianggap sebagai no-op yang tidak berguna (ada jumlah yang tak terbatas di JavaScript sehingga tidak ada yang membuat contoh Anda di sini istimewa).Sama sekali tidak ada masalah atau penalti performa jika menggunakan
Function.prototype
over() => {}
.Manfaat utama dari
Function.prototype
adalah memiliki fungsi tunggal daripada mendefinisikan ulang fungsi anonim baru setiap saat. Sangat penting untuk menggunakan no-op likeFunction.prototype
saat menentukan nilai default dan memo karena memberi Anda penunjuk objek yang konsisten yang tidak pernah berubah.Alasan saya merekomendasikan
Function.prototype
daripadaFunction
karena mereka tidak sama:Selain itu, tolok ukur dari jawaban lain menyesatkan . Nyatanya,
Function.prototype
bekerja lebih cepat daripada() => {}
bergantung pada cara Anda menulis dan menjalankan tolok ukur:Anda tidak bisa mempercayai tolok ukur JS << Secara khusus menyebutkan tolok ukur pada pertanyaan ini.
Jangan mengatur kode Anda dari tolok ukur; lakukan apa pun yang bisa dipelihara dan biarkan penerjemah mencari cara untuk mengoptimalkan dalam jangka panjang.
sumber