开发者问题收集

在使用 Javascript 中的对象之前,是否必须在其中声明一个空数组?

2019-02-21
2315

所以,我刚开始学习 Javascript,我遇到的问题之一就是根据支付金额计算小费。这是我的第一次尝试:

var john = {
    bills: [124, 48, 268, 180, 42],
    calculateTip: function() {
        for (var i = 0; i < this.bills.length; i++) {
            if (this.bills[i] < 50) {
                this.tips[i] = this.bills[i] * 0.2;
            } else if (this.bills[i] < 200) {
                this.tips[i] = this.bills[i] * 0.15;
            } else {
                this.tips[i] = this.bills[i] * 0.1;
            }
        }
        return this.tips;
    }
};

john.calculateTip();
console.log(john.tips);

但是这是我会得到的错误:

Uncaught TypeError: Cannot set property '0' of undefined
    at Object.calculateTip (script.js:8)
    at script.js:17
calculateTip @ script.js:8
(anonymous) @ script.js:17

然后我在对象内部声明了一个空数组:

var john = {
    bills: [124, 48, 268, 180, 42],
    tips: [],
    calculateTip: function() {
        for (var i = 0; i < this.bills.length; i++) {
            if (this.bills[i] < 50) {
                this.tips[i] = this.bills[i] * 0.2;
            } else if (this.bills[i] < 200) {
                this.tips[i] = this.bills[i] * 0.15;
            } else {
                this.tips[i] = this.bills[i] * 0.1;
            }
        }
        return this.tips;
    }
};

john.calculateTip();
console.log(john.tips);

它工作得很好。

我的问题是

当我在对象内部的函数内创建一个普通变量而不是数组时,我不必事先声明它。数组总是这样吗?有人能详细解释一下我遇到的错误吗?

2个回答

这只是链接到这样一个事实:在任何声明的 JS 对象中,您都可以引用任何属性名称(您只会有一个未定义的值):

var test = { name: "Hello" }
console.log(test.anything) // Would print undefined

var test2 = { 
             name: "Hello"
             test3 : {}
            }

console.log(test2.test3.anything) // Would print undefined

但在您的情况下,您试图访问不存在的选项卡的特定索引,因此未编入索引

您的错误指的是您正在尝试的第一个分配:

Uncaught TypeError: Cannot set property '0' of undefined

在此行当 i = 0 时:

this.tips[i] = this.bills[i] * 0.2;
      ^
   undefined
Then undefined[0] would throw the error
Seba99
2019-02-21

是的,您必须在访问复杂对象之前声明它们。 您应该这样做的原因很简单 - 如果根本没有设置值,则每个对象字段都有一个值 undefined 。 在这种情况下,您只是试图访问 undefined 值的第一个元素,这导致了错误。 如果您想访问 undefined 属性的子属性,也会抛出相同的错误。

var a = {
    b: '111'
}

a.c.d = '222'

不起作用,因为缺少属性 c 并且它的值为 undefined 。您应该先创建属性 c

var a = {
    b: '111',
    c: {}

}

a.c.d = '222'

会起作用

Andry Shutka
2019-02-21