Как исправить "Uncaught TypeError: Невозможно установить свойство '0' из неопределенного" - PullRequest
0 голосов
/ 07 марта 2020

Ниже код пытается выяснить, когда массивы (bill, tipValue, totalAmmount) объявляются в методе объекта, который я получаю "невозможно установить свойство '0' неопределенная ошибка. Но, когда те же массивы объявляются вне объект, то я получаю ожидаемый результат "

код получает исключение:

var john = {
    bill: [124, 48, 268, 180, 42],
    tipValue: [],
    totalAmmount: [],
    calcTip() {
        this.bill.forEach(function (ele, i) {
            this.tipValue[i] = innercalc(ele);
            this.totalAmmount[i] = this.tipValue[i] + ele;
        }); //not working code

        function innercalc(value) {
            if (value < 50)
                return value * 0.2;
            else if (value > 50 && value < 200)
                return value * 0.15;
            else if (value > 200)
                return value * 0.1;
        }
    }
}

john.calcTip();
console.log(john.tipValue);
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   
    <script src="codingchallange5.js"></script>

</body>
</html>

Uncaught Исключение: Невозможно установить свойство '0' из неопределенного

Код, который работает:

var tipValue = [];
var totalAmmount = [];
var john = {
    bill: [124, 48, 268, 180, 42],
    // tipValue: [],
    // totalAmmount: [],
    calcTip() {
        this.bill.forEach(function (ele, i) {
            tipValue[i] = innercalc(ele);
            totalAmmount[i] = tipValue[i] + ele;
        }); //not working code

        function innercalc(value) {
            if (value < 50)
                return value * 0.2;
            else if (value > 50 && value < 200)
                return value * 0.15;
            else if (value > 200)
                return value * 0.1;
        }
    }
}

john.calcTip();
console.log(tipValue);
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
    <script src="codingchallange5.js"></script>

</body>
</html>

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Используйте функцию стрелки. Он не будет связываться с this, и все будет работать так, как вы ожидали:

var john = {
  bill: [124, 48, 268, 180, 42],
  tipValue: [],
  totalAmmount: [],
  calcTip() {

    this.bill.forEach((ele, i) => { // replace with arrow function here
      this.tipValue[i] = innercalc(ele);
      this.totalAmmount[i] = this.tipValue[i] + ele;
    });

    function innercalc(value) {
      if (value < 50)
        return value * 0.2;
      else if (value > 50 && value < 200)
        return value * 0.15;
      else if (value > 200)
        return value * 0.1;
    }

  }
}

john.calcTip();
console.log(john.tipValue);

От MDN: Выражение функции стрелки является синтаксически компактной альтернативой регулярному выражению функции, хотя и без собственных привязок к this, arguments, super или new.target ключевых слов.

0 голосов
/ 07 марта 2020

Когда вы использовали this в функции forEach () , по умолчанию оно равно undefined , поскольку вы не передали ни одного ссылочного аргумента. Вам необходимо передать ссылку на Джон на forEach () !

    this.bill.forEach(function (ele, i) {
            this.tipValue[i] = innercalc(ele);
            this.totalAmmount[i] = this.tipValue[i] + ele;
        }, this);
array.forEach(function(currentValue, index, arr), thisValue)

thisValue :

  • Необязательно. Значение, которое будет передано в функцию, которая будет использоваться в качестве значения this.
  • Если этот параметр пуст, значение undefined будет передано в качестве значения this.

JavaScript Метод массива forEach ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...