Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вообще ничего не понял в этом коде... (https://javascript.ru/forum/misc/79917-voobshhe-nichego-ne-ponyal-v-ehtom-kode.html)

jaroslav.tavgen 07.04.2020 21:27

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

voraa 08.04.2020 07:03

Поизучайте автовставку ';'

Array.prototype.sum = function (...arguments){
    return this.reduce(arguments);
};
[1,2,3].sum((a,b)=>a+b);

рони 08.04.2020 09:34

voraa,
чего то в супе коде не хватает. :)

voraa 08.04.2020 09:40

Цитата:

Сообщение от рони (Сообщение 522445)
voraa,
чего то в супе коде не хватает. :)

Я отвечаю на вопрос почему массив - undefined.
А с кодами (reduce, ...) - лучше человек сам поучится разбираться.

рони 08.04.2020 09:55

voraa,
почему бы не довести код, до рабочего состояния в целом?

voraa 08.04.2020 10:01

Цитата:

Сообщение от рони (Сообщение 522447)
voraa,
почему бы не довести код, до рабочего состояния в целом?

Array.prototype.sum = function (arguments){
    return this.reduce(arguments);
};
alert([1,2,3].sum((a,b)=>a+b));


Можно и код написать, когда делать нечего.
Но люди сюда приходят с конкретными вопросами.
Если я просто в коде уберу эти гребанные три точки, то этого мало.
Человек должен понять, что они обозначают, когда использовать их, а когда нет.
Если человек учится программировать, то это подразумевает, что он сам что то читает из документации, сам пробует, сам исправляет ошибки.
Ну бывает, упрешься в какую нибудь ерунду (лишнюю запятую, не поставленный ; ) и тупо смотришь, не видя этой мелочи.
Можно подсказать, какой API использовать...
Но писать коды, решая задачки для студентов....

рони 08.04.2020 10:12

Цитата:

Сообщение от voraa
Если я просто в коде уберу эти гребанные три точки, то этого мало.

ок, подождём пока код исправит автор темы.

jaroslav.tavgen 12.04.2020 11:55

Цитата:

Сообщение от voraa (Сообщение 522440)
Поизучайте автовставку ';'

Array.prototype.sum = function (...arguments){
    return this.reduce(arguments);
};
[1,2,3].sum((a,b)=>a+b);

Офигеть. То есть, если добавить точку с запятой, то этого аномального undefined нет.

А как это работает? Я прочитал про автоставку точки с запятой https://codeburst.io/ecmascript-auto...n-50f09091e377 , но до сих пор не понял, что меняет наличие или отсутствие точки с запятой после закрывающей скобки }

UPD: начинаю понимать. Дело в том. что [1,2,3]... идёт сразу после закрывающей фигурной скобки. Если в консоле Chrome в начале отдельно выполнить Array.prototype..., а потом отдельно [1,2,3]... , то undefined нет. В общих чертах начал понимать, но до конца пока неясно.

voraa 12.04.2020 12:32

В первом правиле говорится про токен-нарушитель. Тоесть нечто такое, что делает синтаксическую конструкцию недопустимой.

Но конструкция }[ - вполне допустима

Array.prototype.sum = function (...arguments){returnthis.reduce(arguments);}[1,2,3]

Мы описали какую то функцию. Функция - это объект. К объекту применима операция [] для получения свойства по имени.
[1,2,3] - тут используется операция ',', которая дает значение последнего из выражений (3)
Т.е приведенный выше пример пытается взять значение свойства с именем '3' у объекта функции. Такого нет, поэтому undefined/

Nexus 12.04.2020 12:39

jaroslav.tavgen, а что вы, собственно, сделать то пытаетесь?
На имплементацию метода «sum» это не похоже, на алиас базового метода «reduce» - тоже.

Хотите понять в чем у вас ошибка - дебажте, посмотрите, что у вас находится в переменной «arguments».

P.S. переопределять значение переменной «arguments» - не есть хорошо, лучше подберите своей переменной другое название, например «args»


Часовой пояс GMT +3, время: 09:57.