Katakanlah x
, a
dan b
angka. Saya perlu membatasi x
batasan segmen [a, b]
.
Saya bisa menulis Math.max(a, Math.min(x, b))
, tetapi saya rasa itu tidak mudah dibaca. Apakah ada yang punya cara pintar untuk menulis ini dengan cara yang lebih mudah dibaca?
javascript
coding-style
Samuel Rossille
sumber
sumber
Math.min
danMath.max
tidak relevan selama parameterMath.min
ismax
dan parameterMath.max
ismin
.Number.prototype
dalam hal ini) keliru karena berbagai alasan. Lihat "Praktik buruk: Perpanjangan prototipe asli" di developer.mozilla.org/en-US/docs/Web/JavaScript/…pendekatan yang kurang berorientasi "Matematika", tetapi juga harus bekerja, dengan cara ini, tes </> diekspos (mungkin lebih dimengerti daripada minimaxing) tetapi itu benar-benar tergantung pada apa yang Anda maksud dengan "dibaca"
sumber
Math.random()
panggilan yang jauh lebih mahal , pendekatan sederhana ini 10 x lebih cepat .Pembaruan untuk ECMAScript 2017:
Tetapi perhatikan bahwa pada hari ini, ini adalah proposal Tahap 1 . Sampai mendapat banyak dukungan, Anda dapat menggunakan polyfill .
sumber
sumber
prototype
sangat elegan ketika datang untuk benar-benar menggunakan fungsinya.Ini tidak ingin menjadi jawaban "just-use-a-library" tetapi jika Anda menggunakan Lodash Anda dapat menggunakan
.clamp
:Yang seperti itu:
Berikut ini implementasinya, diambil dari sumber Lodash :
Juga, perlu dicatat bahwa Lodash membuat metode tunggal tersedia sebagai modul mandiri, jadi jika Anda hanya membutuhkan metode ini, Anda bisa menginstalnya tanpa perpustakaan:
sumber
Jika Anda dapat menggunakan fungsi panah ES6, Anda juga bisa menggunakan pendekatan aplikasi parsial:
sumber
Jika Anda tidak ingin mendefinisikan fungsi apa pun, menulis seperti
Math.min(Math.max(x, a), b)
itu tidak terlalu buruk.sumber
Dalam semangat keseksian panah, Anda bisa membuat penjepit mikro / constrain / gate / & c. berfungsi menggunakan parameter istirahat
Lalu, berikan tiga nilai
Artinya, sekali lagi, jika secara seksi, maksud Anda 'pendek'
sumber
clamp
, perf akan menerima pukulan serius jika Anda memiliki logika kompleks (bahkan jika itu "seksi")Ini memperluas opsi ternary ke jika / jika minified yang setara dengan opsi ternary tetapi tidak mengorbankan keterbacaan.
Diminimalkan ke 35b (atau 43b jika menggunakan
function
):Juga, tergantung pada alat atau browser apa yang Anda gunakan, Anda mendapatkan berbagai hasil apakah implementasi berbasis matematika atau implementasi berbasis terner lebih cepat. Dalam hal kinerja yang kira-kira sama, saya akan memilih keterbacaan.
sumber
Kesukaanku:
sumber
[1,5,19].sort()[1]
mengembalikan 19. Bisa diperbaiki seperti ini:[min,x,max].sort(function(a, b) { return a - b; })[1]
tetapi ini tidak seksi lagi. Selain ketika banyak digunakan mungkin masalah kinerja untuk membuat array baru hanya untuk membandingkan tiga angka.[min, x, max].sort((a,b) => a-b)[1]