Digamos x
, a
e b
são números. Eu preciso limitar x
os limites do segmento [a, b]
.
Eu sei escrever Math.max(a, Math.min(x, b))
, mas não acho que seja muito fácil de ler. Alguém tem uma maneira inteligente de escrever isso de uma maneira mais legível?
javascript
coding-style
Samuel Rossille
fonte
fonte
Math.min
eMath.max
é irrelevante, desde que o parâmetro deMath.min
émax
e o parâmetro deMath.max
sejamin
.Number.prototype
neste caso) é desaconselhada por vários motivos. Consulte "Má prática: extensão de protótipos nativos" em developer.mozilla.org/en-US/docs/Web/JavaScript/…uma abordagem menos orientada à "matemática", mas também deve funcionar, dessa forma, o teste </> é exposto (talvez mais compreensível que o minimax), mas realmente depende do que você quer dizer com "legível"
fonte
Math.random()
chamada muito mais cara , essa abordagem simples é 10 vezes mais rápida .Atualização para o ECMAScript 2017:
Mas observe que, atualmente, é uma proposta do Estágio 1 . Até que ele seja amplamente suportado, você pode usar um polyfill .
fonte
fonte
prototype
muito elegante quando se trata de realmente usar a função.Isso não quer ser uma resposta "apenas use uma biblioteca", mas caso você esteja usando o Lodash, você pode usar
.clamp
:De modo a:
Aqui está sua implementação, extraída da fonte Lodash :
Além disso, vale a pena notar que o Lodash disponibiliza métodos únicos como módulos autônomos; portanto, caso você precise apenas desse método, basta instalá-lo sem o restante da biblioteca:
fonte
Se você conseguir usar as funções de seta es6, também poderá usar uma abordagem de aplicativo parcial:
fonte
Se você não deseja definir nenhuma função, escrevê-la como
Math.min(Math.max(x, a), b)
essa não é ruim.fonte
No espírito da sensualidade das flechas, você pode criar um micro grampo / restrição / portão / & c. função usando parâmetros de descanso
Depois é só passar em três valores
Ou seja, novamente, se por sexy, você quer dizer 'curto'
fonte
clamp
, perf vai tomar uma batida grave se você tem lógica complexa (mesmo que seja "sexy")Isso expande a opção ternária para if / else que minified é equivalente à opção ternária, mas não sacrifica a legibilidade.
Minimize para 35b (ou 43b se estiver usando
function
):Além disso, dependendo de quais ferramentas de perf ou navegador você usa, você obtém vários resultados, se a implementação baseada em matemática ou a implementação ternária é mais rápida. No caso de aproximadamente o mesmo desempenho, eu optaria pela legibilidade.
fonte
Meu favorito:
fonte
[1,5,19].sort()[1]
retorna 19. Poderia ser corrigido assim:[min,x,max].sort(function(a, b) { return a - b; })[1]
mas isso não é mais sexy. Além de ser muito usado, pode ser um problema de desempenho criar uma nova matriz apenas para comparar três números.[min, x, max].sort((a,b) => a-b)[1]