arguments
Объект в JavaScript является нечетной бородавка-он действует так же , как массив в большинстве случаев, но это не на самом деле объект массива. Так как это на самом деле что - то совсем другое , это не имеет полезные функции от Array.prototype
как forEach
, sort
, filter
, и map
.
Тривиально легко создать новый массив из объекта аргументов с простым циклом for. Например, эта функция сортирует свои аргументы:
function sortArgs() {
var args = [];
for (var i = 0; i < arguments.length; i++)
args[i] = arguments[i];
return args.sort();
}
Однако это довольно жалкая вещь, которую нужно сделать, просто чтобы получить доступ к чрезвычайно полезным функциям массива JavaScript. Есть ли встроенный способ сделать это с помощью стандартной библиотеки?
javascript
arrays
sorting
arguments
variadic-functions
Эндрю Колсон
источник
источник
Ответы:
ES6 с использованием остальных параметров
Если вы можете использовать ES6, вы можете использовать:
Остальные параметры
Как вы можете прочитать в ссылке
Если вам интересен
...
синтаксис, он называется Spread Operator, и вы можете прочитать больше здесь .ES6 используя Array.from ()
Используя Array.from :
Array.from
просто преобразуйте объекты типа Array или Iterable в экземпляры Array.ES5
Вы действительно можете просто использовать
Array
«sslice
функцию на объекте аргументов, и он преобразует его в стандартный массив JavaScript. Вам просто нужно ссылаться на него вручную через прототип Array:Почему это работает? Ну, вот выдержка из самой документации ECMAScript 5 :
Поэтому
slice
работает на все, что имеетlength
свойство, котороеarguments
удобно делает.Если
Array.prototype.slice
для вас это слишком много, вы можете немного его сократить, используя литералы массива:Однако я склонен считать, что предыдущая версия более явная, поэтому я бы предпочел ее. Злоупотребление массивом буквенной нотации кажется хакерским и выглядит странно.
источник
0
? Поскольку нет аргументов, которые вы хотите передать, почему вы не можете просто использоватьvar args = Array.prototype.slice.call(arguments);
? [ Страница аргументов MDC ] ( developer.mozilla.org/en/JavaScript/Reference/… ) предлагает метод без0
.function sortArgs(...argsToSort) { return argsToSort.sort(); }
от MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Стоит также обратиться к этой вики-странице библиотеки обещаний Bluebird, которая показывает, как управлять
arguments
объектом в массив таким образом, чтобы сделать функцию оптимизируемой под механизм JavaScript V8 :Этот метод используется в пользу
var args = [].slice.call(arguments);
. Автор также показывает, как шаг сборки может помочь уменьшить детализацию.источник
Некоторые методы массива специально сделаны так, чтобы не требовать, чтобы целевой объект был фактическим массивом. Они только требуют, чтобы у цели было свойство с именем length и indexes (которые должны быть нулевыми или большими целыми числами).
источник
Использование:
Array(arg1, arg2, ...)
возвращается[arg1, arg2, ...]
Array(str1)
возвращается[str1]
Array(num1)
возвращает массив сnum1
элементамиВы должны проверить количество аргументов!
Array.slice
версия (медленнее):Array.push
версия (медленнее, быстрее, чем ломтик):Переместить версию (медленнее, но маленький размер быстрее):
Array.concat
версия (самая медленная):источник
Если вы используете jQuery, то, на мой взгляд, гораздо легче запомнить следующее:
источник
В ECMAScript 6 нет необходимости использовать такие уродливые хаки, как
Array.prototype.slice()
. Вместо этого вы можете использовать синтаксис распространения (...
) .Это может выглядеть странно, но это довольно просто. Он просто извлекает
arguments
элементы и помещает их обратно в массив. Если вы все еще не понимаете, посмотрите эти примеры:Обратите внимание, что он не работает в некоторых старых браузерах, таких как IE 11, поэтому, если вы хотите поддерживать эти браузеры, вы должны использовать Babel .
источник
Вот тест нескольких методов, преобразующих аргументы в массив.
Как по мне, лучшее решение для небольшого количества аргументов:
Для других случаев:
источник
sortArgs
в 6 раз быстрее в Firefox, но в два раза медленнее в последнем Chrome, по сравнению сArray.apply
.Я рекомендую использовать оператор распространения ECMAScript 6 , который будет привязывать конечные параметры к массиву. С этим решением вам не нужно прикасаться к
arguments
объекту, и ваш код будет упрощен. Недостатком этого решения является то, что оно не работает в большинстве браузеров, поэтому вместо этого вам придется использовать JS-компилятор, такой как Babel. Под капотом Бабель превращаетсяarguments
в Массив с циклом for.Если вы не можете использовать ECMAScript 6, я рекомендую взглянуть на некоторые другие ответы, такие как @Jonathan Fingland
источник
Lodash:
в действии:
производит:
источник
_.toArray
?_.toArray
это более уместно.Использование
Array.from()
, которое принимает массивоподобный объект (такой какarguments
) в качестве аргумента и преобразует его в массив:Обратите внимание, что он не работает в некоторых старых браузерах, таких как IE 11, поэтому, если вы хотите поддерживать эти браузеры, вы должны использовать Babel .
источник
источник
Еще один ответ.
Используйте чёрные магические заклинания:
Firefox, Chrome, Node.js, IE11 в порядке.
источник
__proto__
не рекомендуется. Смотрите MDN документы .Попробуйте использовать
Object.setPrototypeOf()
Объяснение: Набор
prototype
изarguments
кArray.prototype
Объяснение: Взять каждый индекс
arguments
, поместить элемент в массив с соответствующим индексом массива.может альтернативно использовать
Array.prototype.map()
Объяснение: Взять каждый индекс
arguments
, поместить элемент в массив с соответствующим индексом массива.for..of
петляили
Object.create()
Объяснение: Создать объект, установить свойства объекта для элементов с каждым индексом
arguments
; наборprototype
созданного объекта вArray.prototype
источник
Object.setPrototypeOf
предупреждает, что это «очень медленная операция». С какой стати я использовал это сноваArray.prototype.slice.call
?Вот чистое и краткое решение:
Object.values( )
будет возвращать значение объекта в виде массива, а так какarguments
это объект, он будет существенно преобразоватьarguments
в массив, таким образом , предоставляя вам все вспомогательные функции на массиве, такие какmap
,forEach
,filter
и т.д.источник
Беншмарк 3 метода:
РЕЗУЛЬТАТ?
Наслаждайтесь !
источник
arguments.length == 1?[arguments[0]]:Array.apply(null, arguments);
чтобы предотвратить вызов функции только с одним целочисленным аргументомdummyFn(3)
и вызывает результат[,,]
dummyFn(3)
что это? эта функция не существует ...источник
Хотя остальные параметры работают хорошо, если вы хотите продолжить использовать
arguments
по какой-то причине, рассмотрите[...arguments]
можно рассматривать как своего рода альтернативуArray.from(arguments)
, которая также отлично работает.Альтернатива ES7 - это понимание массива:
Это может быть проще, если вы хотите обработать или отфильтровать аргументы перед сортировкой:
источник
Я попробовал простую технику разрушения
источник
Объект Arguments доступен только внутри тела функции. Хотя вы можете индексировать объект Arguments как массив, это не массив. Он не имеет никаких свойств массива, кроме длины.
Хотя он может быть проиндексирован как массив, как вы можете видеть в этом примере:
Однако объект Arguments не является массивом и не имеет никаких других свойств, кроме length.
Вы можете преобразовать объект arguments в массив, после чего вы сможете получить доступ к объекту Arguments.
Есть много способов получить доступ к объекту arguments внутри тела функции, и они включают в себя:
Array.prototype.slice.call (аргументы)
[] .slice.call (аргументы).
источник
Вы можете создать функцию многократного использования, чтобы сделать это с любыми аргументами, самый простой из них:
Синтаксис распространения может быть использован в ES6 и выше ...
Но если вы хотите использовать что-то совместимое с ES5 и ниже, вы можете использовать его
Array.prototype.slice.call
, поэтому ваш код выглядит следующим образом:Есть также несколько других способов сделать это, например, используя
Array.from
или перебирая аргументы и назначая их новому массиву ...источник
Это очень старый вопрос, но я думаю, что у меня есть решение, которое немного легче набрать, чем предыдущие решения, и не зависит от внешних библиотек:
источник
Array.apply
не будет работать, если у вас есть только один положительный целочисленный аргумент. Это потому, чтоnew Array(3)
создает массив длиной3
. Если быть более конкретным, то результат будет[undefined, undefined, undefined]
и нет[3]
.