Это работает только для традиционного JavaScript function, но не для функций ES2015 + жирная стрелка =>. Для тех, вы хотите использовать ...argsв определении функции следующим образом: (...args) => console.log(args).
Sawtaytoes
141
В аргументов является массивом, как объект (не фактический массив). Пример функции ...
function testArguments ()// <-- notice no arguments specified{
console.log(arguments);// outputs the arguments to the consolevar htmlOutput ="";for(var i=0; i < arguments.length; i++){
htmlOutput +='<li>'+ arguments[i]+'</li>';}
document.write('<ul>'+ htmlOutput +'</ul>');}
Почему бы не опубликовать результат здесь тоже? :)
Джонатан Азулай
2
Это намного лучше, чем принятый ответ, потому что он содержит рабочий фрагмент кода и показывает вывод. Принятый ответ слишком скуден.
Mac
Хороший ответ ... будет отличным ответом с расширением "не фактического массива"
terpinmd
Я добавил ссылку на простое описание: «объект в виде массива» - это просто «объект, имеющий свойство длины неотрицательного целого числа и обычно некоторые индексированные свойства». Из ссылки Mozilla: «Он похож на массив, но не имеет никаких свойств массива, кроме длины».
Люк
31
ES6 допускает конструкцию, в которой аргумент функции указывается с помощью обозначения «...», такого как
function testArgs (...args){// Where you can test picking the first element
console.log(args[0]);}
Это кажется единственным способом при использовании функции стрелки. a = () => {console.log(arguments);}; a('foo');дает -- Uncaught ReferenceError: arguments is not defined Однако a = (...args) => {console.log(args);}; a('foo');дает["foo"]
Дэвид Баукум
1
@DavidBaucum это правильно. Потому что функция стрелки не создает новую область видимости, а «аргументы» собираются из области видимости. Но в худшем случае это не ReferenceError. Дело в том, что «аргументы» собираются из внешней области видимости. Тогда вы не получите исключения и, возможно, странные ошибки в вашем приложении.
Спасибо за обновление. Используйте JSON.stringify и JSON.parse в качестве альтернативы: function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); } если требуется сохранение вместо строкового преобразования , используйте алгоритм внутреннего структурированного клонирования . Если узлы DOM пройдены, используйте XMLSerializer, как в не связанном вопросе . with (new XMLSerializer()) {serializeToString(document.documentElement) }
Пол Свитт
7
Как и многие другие, argumentsсодержит все аргументы, переданные функции.
Если вы хотите вызвать другую функцию с такими же аргументами, используйте apply
Пример:
var is_debug =true;var debug =function(){if(is_debug){
console.log.apply(console, arguments);}}
debug("message","another argument")
Аналогичный ответ на Гуннар, с более полным примером: вы можете даже прозрачно вернуть все это:
function dumpArguments(...args){for(var i =0; i < args.length; i++)
console.log(args[i]);return args;}
dumpArguments("foo","bar",true,42,["yes","no"],{'banana':true});
Да, если вы не знаете, сколько аргументов возможно во время объявления функции, вы можете объявить функцию без параметров и получить доступ ко всем переменным по массиву аргументов, который передается во время вызова функции.
Если вы работаете как букмарклет, вам может понадобиться обернуть каждый аргумент структурированных данных в конструкторе ошибок для JSON.stringifyправильной работы.
Во-первых: это клонирует все объекты, которые передаются. Во-вторых: не все можно преобразовать в формат JSON. А именно: функции, объекты DOM, указанные даты преобразуются в строки ...
Джон Дворжак
@JanDvorak Можете ли вы отредактировать мой ответ с помощью функции, которая обрабатывает DOM-объекты, функции и даты?
Пол Свитт
1
+1, пытаясь передать аргументы для сообщения об ошибке в виде строки, объект заканчивается строкой '[Аргументы объекта]', и запись в консоль не отображает значения. Хотя он, кажется, не отвечает на ФП, он отвечает на мой вопрос, спасибо!
function
, но не для функций ES2015 + жирная стрелка=>
. Для тех, вы хотите использовать...args
в определении функции следующим образом:(...args) => console.log(args)
.В аргументов является массивом, как объект (не фактический массив). Пример функции ...
Попробуйте это ...
Полная информация: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments
источник
ES6 допускает конструкцию, в которой аргумент функции указывается с помощью обозначения «...», такого как
источник
a = () => {console.log(arguments);}; a('foo');
дает-- Uncaught ReferenceError: arguments is not defined
Однакоa = (...args) => {console.log(args);}; a('foo');
дает["foo"]
arguments
Объект , где функция аргументы сохраняются.Объект arguments действует и выглядит как массив, в основном это так, у него просто нет методов, которые делают массивы, например:
Array.forEach(callback[, thisArg]);
Array.map(callback[, thisArg])
Array.filter(callback[, thisArg]);
Array.slice(begin[, end])
Array.indexOf(searchElement[, fromIndex])
Я думаю, что лучший способ преобразовать
arguments
объект в настоящий массив - это так:Это сделает его массивом;
многоразовое:
результат:
источник
[].slice.apply(arguments);
не может быть лучшим способом, потому что это вызывает ненужное выделение пустого массива.Вы также можете преобразовать его в массив, если хотите. Если доступны дженерики Array:
В противном случае:
от Mozilla MDN :
источник
function foo() { foo.bar = JSON.stringify(arguments); foo.baz = JSON.parse(foo.bar); }
если требуется сохранение вместо строкового преобразования , используйте алгоритм внутреннего структурированного клонирования . Если узлы DOM пройдены, используйте XMLSerializer, как в не связанном вопросе .with (new XMLSerializer()) {serializeToString(document.documentElement) }
Как и многие другие,
arguments
содержит все аргументы, переданные функции.Если вы хотите вызвать другую функцию с такими же аргументами, используйте
apply
Пример:
источник
Аналогичный ответ на Гуннар, с более полным примером: вы можете даже прозрачно вернуть все это:
Вывод:
https://codepen.io/fnocke/pen/mmoxOr?editors=0010
источник
Да, если вы не знаете, сколько аргументов возможно во время объявления функции, вы можете объявить функцию без параметров и получить доступ ко всем переменным по массиву аргументов, который передается во время вызова функции.
источник
В ES6 вы можете сделать что-то вроде этого:
источник
В ES6 используйте
Array.from
:Для кода не-ES6 используйте JSON.stringify и JSON.parse:
Если требуется сохранение вместо строкового преобразования, используйте алгоритм внутреннего структурированного клонирования .
Если узлы DOM пройдены, используйте XMLSerializer, как в не связанном вопросе .
Если вы работаете как букмарклет, вам может понадобиться обернуть каждый аргумент структурированных данных в конструкторе ошибок для
JSON.stringify
правильной работы.Ссылки
Структура Clone CommonJS Модуль
JS Object Clone
MDN: Array.from ()
источник