Вообще ничего не понял в этом коде...
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, время: 03:25. |