我对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)

09-10 05:36
查看更多