ES6 с использованием остальных параметров
Если вы можете использовать ES6, вы можете использовать:
Параметры покоя
function sortArgs(...args) {
return args.sort(function (a, b) { return a - b; });
}
document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();
Как вы можете прочитать по ссылке
Синтаксис параметра rest позволяет нам представлять неопределенное количество аргументов в виде массива.
Если вам интересен синтаксис ...
, он называется Оператор распространения , и вы можете прочитать больше здесь .
ES6 с использованием Array.from ()
Использование Array.from :
function sortArgs() {
return Array.from(arguments).sort(function (a, b) { return a - b; });
}
document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();
Array.from
просто преобразуйте объекты типа Array или Iterable в экземпляры Array.
ES5
Вы можете просто использовать функцию Array
slice
для объекта аргументов, и она преобразует ее в стандартный массив JavaScript. Вам просто нужно ссылаться на него вручную через прототип Array:
function sortArgs() {
var args = Array.prototype.slice.call(arguments);
return args.sort();
}
Почему это работает? Вот отрывок из самой документации ECMAScript 5 :
ПРИМЕЧАНИЕ : функция slice
специально сделана не привязанной к типу; он не требует, чтобы его значение this было объектом Array. Поэтому его можно передавать другим объектам для использования в качестве метода. Возможность успешного применения функции slice
к хост-объекту зависит от реализации.
Следовательно, slice
работает на всем, что имеет свойство length
, что удобно делать arguments
.
Если Array.prototype.slice
слишком много для вас, вы можете немного его сократить, используя литералы массива:
var args = [].slice.call(arguments);
Однако я склонен считать, что предыдущая версия более явная, поэтому я бы предпочел ее. Злоупотребление массивом буквенной нотации кажется хакерским и выглядит странно.