Объект не имеет ошибки "уменьшить" метода при использовании аргументов в node.js?
Почему я получаю сообщение об ошибке при использовании arguments
как это?
function sum(){
return arguments.reduce(function(a,b){
console.log(a+b)
return a+b;
},0);
}
sum(1,2,3,4);
Ошибка:
/Users/bob/Documents/Code/Node/hello.js:2
return arguments.reduce(function(a,b){
^
TypeError: Object #<Object> has no method 'reduce'
at sum (/Users/bob/Documents/Code/Node/hello.js:2:19)
at Object.<anonymous> (/Users/bob/Documents/Code/Node/hello.js:8:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:903:3
Это от г-на Крокфорда JS лекции.
Ответы
Ответ 1
arguments
не является реальным массивом, он представляет собой объект типа "array-like" и reduce
не является методом объектов типа массива. Вы можете использовать reduce
, передав arguments
в качестве контекста, например:
[].reduce.call(arguments, function(a, b) {
});
Изменить: дополнительную информацию о объектах, похожих на массив, в MDN.
Ответ 2
Крокфорд прямо заявляет, что использование методов Array, таких как reduce() для аргументов, было введено в ECMAscript 5. До ECMAscript5 даже Array не уменьшал() во всех реализациях Javascript. Для таких вещей, как map() и reduce(), я рекомендую использовать библиотеку типа Underscore, которая скрывает различия в реализации.
Ответ 3
Вы получаете сообщение об ошибке, потому что arguments
- это объект, а не список. Рассмотрим следующее:
> function a(){ return arguments; }
> b = a(1, 2, 3);
> b
{ '0': 1,
'1': 2,
'2': 3 }
Документация JavaScript MDN для arguments
содержит дополнительную информацию, в том числе:
Объект, подобный массиву, соответствующий аргументам, переданным функции.