我对JavaScript非常陌生。我试图将新的价值推向一个对象。但是,当我尝试推送myObj中不存在的数组时,出现了Cannot read property 'push' of undefined
错误。
我的代码如下:
var myObj = {
first: "first value",
second: "second value",
}
myObj.third.push(123)
console.log(myObj)
但是当我检查它是否不存在并创建一个空数组,然后推送它时,它就可以工作了。 =>
var myObj = {
first: "first value",
second: "second value",
}
myObj['third'] = myObj.third || []
myObj.third.push(123)
console.log(myObj)
我想知道底层代码是否是最佳实践,是否有更好的方法来实现。
最佳答案
push
方法是Array
原型的一部分,在您的特殊情况下,您尝试访问未定义的属性,该属性在JavaScript中被认为是undefined
,因此您试图将其转换为类似以下内容:
myObj.third.push => myObj.undefined.push
因为
myObj
没有third
键,所以您可以在控制台中尝试执行console.log(myObje.third );
因此,引擎返回一个错误,指出
undefined
没有仅在push
中可用的属性Array
。在这种情况下,您需要在将
myObj.third
用作数组之前,将值分配给myObj.third
,因为有多种方法将值设置为数组,您的答案就是以下方法之一:myObj['third'] = myObj.third || []
该行有效,但是,例如,如果
myObj.third || []
具有值,则在分配操作Uncaught TypeError: myObj.third.push is not a function
的结果时将其用作值,在这种情况下,如果例如:myObj.third = true;
然后您执行以下操作:
myObj.third.push(123);
由于当前
myObj.third
不是数组,因此将显示Array
错误。因此,您需要确保在使用push时正在操作
Array
,或者至少在将属性的值初始化为Array
时,可以找到更多的truthy。您可以在推送之前进行检查的替代方法是:
if ( ! Array.isArray(myObj.third) ) {
myObj.third = [];
}
myObj.third.push(123)