Digamos x
, a
y b
son números. Necesito limitarme x
a los límites del segmento [a, b]
.
Puedo escribir Math.max(a, Math.min(x, b))
, pero no creo que sea muy fácil de leer. ¿Alguien tiene una manera inteligente de escribir esto de una manera más legible?
javascript
coding-style
Samuel Rossille
fuente
fuente
Math.min
yMath.max
es irrelevante siempre que el parámetro deMath.min
ismax
y el parámetro deMath.max
ismin
.Number.prototype
en este caso) no es aconsejable por una variedad de razones. Consulte "Mala práctica: extensión de prototipos nativos" en developer.mozilla.org/en-US/docs/Web/JavaScript/…un enfoque menos orientado a "Matemáticas", pero también debería funcionar, de esta manera, la prueba </> está expuesta (quizás más comprensible que el minimaxing) pero realmente depende de lo que quiere decir con "legible"
fuente
Math.random()
llamada mucho más costosa , este enfoque simple es 10 veces más rápido .Actualización para ECMAScript 2017:
Pero tenga en cuenta que a partir de hoy, es una propuesta de Etapa 1 . Hasta que sea ampliamente compatible, puede usar un polyfill .
fuente
fuente
prototype
muy elegante cuando se trata de usar la función.Esto no quiere ser una respuesta "solo use una biblioteca", pero en caso de que esté usando Lodash, puede usar
.clamp
:Así que eso:
Aquí está su implementación, tomada de la fuente de Lodash :
Además, vale la pena señalar que Lodash pone a disposición métodos individuales como módulos independientes, por lo que en caso de que solo necesite este método, puede instalarlo sin el resto de la biblioteca:
fuente
Si puede usar las funciones de flecha es6, también puede usar un enfoque de aplicación parcial:
fuente
Si no desea definir ninguna función, escribirla como si
Math.min(Math.max(x, a), b)
no fuera tan malo.fuente
En el espíritu de la sensualidad de la flecha, puede crear una micro abrazadera / restricción / puerta / & c. función utilizando parámetros de descanso
Luego solo pasa tres valores
Es decir, de nuevo, si por sexy, te refieres a 'corto'
fuente
clamp
, perf tendrá un gran impacto si tienes una lógica compleja (incluso si es "sexy")Esto expande la opción ternaria en if / else que minified es equivalente a la opción ternary pero no sacrifica la legibilidad.
Se reduce a 35b (o 43b si se usa
function
):Además, dependiendo de qué herramienta de rendimiento o navegador utilice, obtendrá varios resultados de si la implementación basada en matemáticas o la implementación basada en ternario es más rápida. En el caso de aproximadamente el mismo rendimiento, optaría por la legibilidad.
fuente
Mi favorito:
fuente
[1,5,19].sort()[1]
devuelve 19. Podría arreglarse así:[min,x,max].sort(function(a, b) { return a - b; })[1]
pero esto ya no es sexy. Además de cuando se usa mucho, puede ser un problema de rendimiento crear una nueva matriz solo para comparar tres números.[min, x, max].sort((a,b) => a-b)[1]