在使用 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