Disons x
, a
et b
sont des nombres. J'ai besoin de plafonner x
aux limites du segment [a, b]
.
Je sais écrire Math.max(a, Math.min(x, b))
, mais je ne pense pas que ce soit très facile à lire. Quelqu'un a-t-il une manière intelligente d'écrire ceci d'une manière plus lisible?
javascript
coding-style
Samuel Rossille
la source
la source
Math.min
etMath.max
n'est pas pertinent tant que le paramètre deMath.min
estmax
et le paramètre deMath.max
estmin
.Number.prototype
dans ce cas) est déconseillée pour diverses raisons. Voir "Mauvaise pratique: Extension de prototypes natifs" sur developer.mozilla.org/en-US/docs/Web/JavaScript/…une approche moins orientée "Math", mais qui devrait aussi fonctionner, de cette façon, le test </> est exposé (peut-être plus compréhensible que minimaxing) mais cela dépend vraiment de ce que vous entendez par "lisible"
la source
Math.random()
appel beaucoup plus cher , cette approche simple est 10 fois plus rapide .Mise à jour pour ECMAScript 2017:
Mais notez qu'à partir d'aujourd'hui, c'est une proposition de l' étape 1 . Jusqu'à ce qu'il soit largement pris en charge, vous pouvez utiliser un polyfill .
la source
la source
prototype
très élégant lorsqu'il s'agit d'utiliser réellement la fonction.Cela ne veut pas être une réponse "juste utiliser une bibliothèque", mais juste au cas où vous utilisez Lodash, vous pouvez utiliser
.clamp
:Pour que:
Voici sa mise en œuvre, tirée de la source Lodash :
En outre, il convient de noter que Lodash rend des méthodes uniques disponibles en tant que modules autonomes, donc si vous n'avez besoin que de cette méthode, vous pouvez simplement l'installer sans le reste de la bibliothèque:
la source
Si vous êtes capable d'utiliser les fonctions fléchées es6, vous pouvez également utiliser une approche d'application partielle:
la source
Si vous ne voulez définir aucune fonction, l'écrire comme ça
Math.min(Math.max(x, a), b)
n'est pas si mal.la source
Dans l'esprit de la sensualité des flèches, vous pourriez créer une micro pince / contrainte / porte / & c. fonction utilisant les paramètres de repos
Ensuite, passez simplement trois valeurs
C'est, encore une fois, si par sexy, tu veux dire `` court ''
la source
clamp
, perf prendra un sérieux coup si vous avez une logique complexe (même si c'est "sexy")Cela étend l'option ternaire en if / else qui minifié équivaut à l'option ternaire mais ne sacrifie pas la lisibilité.
Réduit à 35b (ou 43b si vous utilisez
function
):En outre, en fonction de l'outil de performance ou du navigateur que vous utilisez, vous obtenez divers résultats quant à savoir si l'implémentation basée sur les mathématiques ou l'implémentation basée sur ternaire est plus rapide. Dans le cas de performances à peu près identiques, j'opterais pour la lisibilité.
la source
Mon préféré:
la source
[1,5,19].sort()[1]
renvoie 19. Cela pourrait être corrigé comme ceci:[min,x,max].sort(function(a, b) { return a - b; })[1]
mais ce n'est plus sexy. En plus d'une utilisation intensive, il peut être un problème de performances de créer un nouveau tableau juste pour comparer trois nombres.[min, x, max].sort((a,b) => a-b)[1]