Скажем x
, a
и b
являются числами. Мне нужно x
ограничить границы сегмента [a, b]
.
Я умею писать Math.max(a, Math.min(x, b))
, но не думаю, что это очень легко читать. Есть ли у кого-нибудь умный способ написать это более читаемым способом?
javascript
coding-style
Сэмюэл Россилль
источник
источник
Math.min
и неMath.max
имеет значения, пока параметрMath.min
ismax
и параметрMath.max
ismin
.Number.prototype
в данном случае) не рекомендуется по ряду причин. См. «Плохая практика: расширение собственных прототипов» на developer.mozilla.org/en-US/docs/Web/JavaScript/…менее «математический» подход, но он также должен работать, таким образом, тест </> выставлен (возможно, более понятен, чем минимаксинг), но это действительно зависит от того, что вы имеете в виду под «читаемым»
источник
Math.random()
вызова, этот простой подход будет в 10 раз быстрее .Обновление для ECMAScript 2017:
Но обратите внимание , что на сегодняшний день, это этап 1 предложение . Пока он не получит широкой поддержки, вы можете использовать полифил .
источник
источник
prototype
очень элегантным, когда дело доходит до фактического использования функции.Это не должно быть ответом типа «просто используйте библиотеку», но на всякий случай, если вы используете Lodash, вы можете использовать
.clamp
:Так что:
Вот его реализация, взятая из источника Lodash :
Также стоит отметить, что Lodash делает отдельные методы доступными в виде отдельных модулей, поэтому, если вам нужен только этот метод, вы можете просто установить его без остальной части библиотеки:
источник
Если вы можете использовать стрелочные функции es6, вы также можете использовать подход частичного приложения:
источник
Если вы не хотите определять какую-либо функцию, написать ее как
Math.min(Math.max(x, a), b)
не так уж плохо.источник
В духе сексуальности стрелы вы можете создать микрозажим / ограничение / гейт / и т. Д. функция с использованием параметров отдыха
Затем просто передайте три значения
То есть, опять же, если под сексуальным вы имеете в виду «короткий»
источник
clamp
, perf серьезно пострадает, если у вас сложная логика (даже если она «сексуальна»)Это расширяет тернарный вариант до if / else, который минимизирован, эквивалентен тернарному варианту, но не жертвует удобочитаемостью.
Уменьшается до 35b (или 43b при использовании
function
):Кроме того, в зависимости от того, какой инструмент perf или браузер вы используете, вы получите различные результаты, будь то реализация на основе математики или троичная реализация быстрее. В случае примерно такой же производительности я бы выбрал удобочитаемость.
источник
Моя любимая:
источник
[1,5,19].sort()[1]
возвращает 19. Это можно исправить вот так:[min,x,max].sort(function(a, b) { return a - b; })[1]
но это уже не сексуально. Помимо интенсивного использования, создание нового массива для сравнения трех чисел может вызвать проблемы с производительностью.[min, x, max].sort((a,b) => a-b)[1]