Вообще ничего не понял в этом коде...
Array.prototype.sum = function (...arguments){
return this.reduce(arguments);
}
[1,2,3].sum((a,b)=>a+b);
Результат: TypeError: Cannot read property 'sum' of undefined с указанием на последнюю строчку. Я, честно говоря, вообще не понял, что произошло:) Как так получилось, что массив стал считаться undefined?:) |
Поизучайте автовставку ';'
Array.prototype.sum = function (...arguments){
return this.reduce(arguments);
};
[1,2,3].sum((a,b)=>a+b);
|
voraa,
чего то в |
Цитата:
А с кодами (reduce, ...) - лучше человек сам поучится разбираться. |
voraa,
почему бы не довести код, до рабочего состояния в целом? |
Цитата:
Array.prototype.sum = function (arguments){
return this.reduce(arguments);
};
alert([1,2,3].sum((a,b)=>a+b));
Можно и код написать, когда делать нечего. Но люди сюда приходят с конкретными вопросами. Если я просто в коде уберу эти гребанные три точки, то этого мало. Человек должен понять, что они обозначают, когда использовать их, а когда нет. Если человек учится программировать, то это подразумевает, что он сам что то читает из документации, сам пробует, сам исправляет ошибки. Ну бывает, упрешься в какую нибудь ерунду (лишнюю запятую, не поставленный ; ) и тупо смотришь, не видя этой мелочи. Можно подсказать, какой API использовать... Но писать коды, решая задачки для студентов.... |
Цитата:
|
Цитата:
А как это работает? Я прочитал про автоставку точки с запятой https://codeburst.io/ecmascript-auto...n-50f09091e377 , но до сих пор не понял, что меняет наличие или отсутствие точки с запятой после закрывающей скобки } UPD: начинаю понимать. Дело в том. что [1,2,3]... идёт сразу после закрывающей фигурной скобки. Если в консоле Chrome в начале отдельно выполнить Array.prototype..., а потом отдельно [1,2,3]... , то undefined нет. В общих чертах начал понимать, но до конца пока неясно. |
В первом правиле говорится про токен-нарушитель. Тоесть нечто такое, что делает синтаксическую конструкцию недопустимой.
Но конструкция }[ - вполне допустима Array.prototype.sum = function (...arguments){returnthis.reduce(arguments);}[1,2,3] Мы описали какую то функцию. Функция - это объект. К объекту применима операция [] для получения свойства по имени. [1,2,3] - тут используется операция ',', которая дает значение последнего из выражений (3) Т.е приведенный выше пример пытается взять значение свойства с именем '3' у объекта функции. Такого нет, поэтому undefined/ |
jaroslav.tavgen, а что вы, собственно, сделать то пытаетесь?
На имплементацию метода «sum» это не похоже, на алиас базового метода «reduce» - тоже. Хотите понять в чем у вас ошибка - дебажте, посмотрите, что у вас находится в переменной «arguments». P.S. переопределять значение переменной «arguments» - не есть хорошо, лучше подберите своей переменной другое название, например «args» |
Цитата:
Почему все тогда почти никогда не ставят точки с запятой после декларации функций? Эта ситуация настолько редкая? Почти все пишут так:
function foo(){
return 3;
}
без точки с запятой после закрывающей фигурной скобки. |
Цитата:
Цитата:
Я так понял, что моей ошибкой было то, что вместо того, чтобы рассматривать переданный аргумент как функцию (function(args)) я рассматривал его как массив аргументов (function(...args)) Цитата:
|
Цитата:
вопрос на засыпку, как используя только Array.prototype.sum и функцию сложения, получить сумму двух массивов? |
Цитата:
Например let a= x + y (a <4 || 8< a)? x+=10 : x-=10 В этом случае будет попытка вызвать функцию y(a <4 || 8< a) или
let f = function () {...}
(a <4 || 8< a)? x+=10 : x-=10
То же - определили функцию и сразу пытаемся ее вызвать |
зачем здесь деструктор?
Array.prototype.sum = function (...arguments) еще пример: return true и return true |
jaroslav.tavgen,
как используя только Array.prototype.sum и функцию сложения, получить сумму двух массивов?
const fn = (a,b)=>a+b;
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function(...args){ return this.reduce/* ... */};
console.log( /* ... */)//21
|
Цитата:
|
Цитата:
и наверно задание скорее для начинающих. |
Цитата:
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function(arg){ return [...this, ...arg].reduce((acc,val)=>acc+val, 0)};
console.log(a.sum(b));
если я правильно понял задачу, конечно... |
Цитата:
|
Цитата:
const fn = (a,b)=>a+b;
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function(...args){ return this.reduce(fn) + args[0].reduce(fn)};
console.log(a.sum(b))//21
|
jaroslav.tavgen,
а можно без использования знака +(везде) а fn применить только в строке 6 :) |
jaroslav.tavgen,
хочется сделать более полноценный вариант вашего кода из первого сообщения не слишком изменяя его. |
Цитата:
|
jaroslav.tavgen,
const fn = (a,b)=>a+b;
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function(...args){ return this.reduce(...args)};
console.log(a.sum(fn, b.sum(fn)))//21
|
const fn = (a, b) => a + b;
const a = [1, 2, 3];
const b = [4, 5, 6];
Array.prototype.sum = function (...args) {
return this.reduce(...args);
};
console.log([a, b].map(v => v.sum(fn)).sum(fn, 100));
тоже поучаствую ) |
SuperZen,
:victory: |
const fn = (a,b)=>a+b;
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function(){ return this.reduce(fn)};
console.log(fn(a.sum(), b.sum())) //21
|
voraa,
:) |
Вроде такого еще не было:
const fn = (a,b)=>a+b;
const a = [1,2,3];
const b = [4,5,6];
Array.prototype.sum = function() { return this.reduce(...arguments); };
console.log([...a, ...b].sum(fn)) //21
|
Цитата:
А то у Nexus (№30), voraa (№28), SuperZen (№26), рони (№25) (см. примеры выше) получается, что если fn заменить на умножение, то метод sum так «просуммирует», что получится умножение... (уже не говоря о сложности использования, которое предполагает дополнительные вызовы fn)
const a = [1, 2, 3];
const b = [4, 5, 6];
Array.prototype.sum = (sum => function(b = []) {
return b.reduce(sum, this.reduce(sum, 0), 0);
})((a, b) => a + b);
console.log(a.sum(b)) // 21
ЕЩЁ Можно выделить в отдельную функцию...
const reducer = (fn, getInitialValue) => function(b = []) {
return b.reduce(fn, this.reduce(fn, getInitialValue()), getInitialValue());
};
Array.prototype.sum = reducer((a, b) => a + b, () => 0);
Array.prototype.mul = reducer((a, b) => a * b, () => 1);
Array.prototype.collectOdds = reducer((a, b) => b % 2 === 0 ? a : a.concat(b), () => []);
const a = [1, 2, 3];
const b = [4, 5, 6];
console.log(a.sum(b)) // 21
console.log(a.mul(b)) // 720
console.log(a.collectOdds(b)) // [1, 3, 5]
ЕЩЁ Можно reducer получить при помощи редукции, что позволит передавать в методы более одного массива...
const reducer = (fn, getInitialValue) => function(...as) {
return [this, ...as].reduce((m, v) => v.reduce(fn, m), getInitialValue());
};
Array.prototype.sum = reducer((a, b) => a + b, () => 0);
Array.prototype.mul = reducer((a, b) => a * b, () => 1);
Array.prototype.collectOdds = reducer((a, b) => b % 2 === 0 ? a : a.concat(b), () => []);
const a = [1, 2, 3];
const b = [4, 5, 6];
console.log([10, 20].sum(a, b)) // 51
console.log(a.mul(b)) // 720
console.log([-1].collectOdds(a, b)) // [-1, 1, 3, 5]
|
Malleys,
:write: |
Цитата:
Почему для алиаса он использовал название "sum" - непонятно. |
| Часовой пояс GMT +3, время: 18:13. |