JavaScript中向对象属性数组push元素报错的解决咨询
问题解决办法
错误原因分析
第一段代码的核心问题:
当目标键不存在时,你直接将data.videoId赋值给了watchObject[data.room],导致该键对应的值是单个值(如字符串、数字),而非数组。后续再对该键调用push方法时,由于单个值没有数组的push方法,就会抛出TypeError: watchObject[data.room].push is not a function。第二段代码的额外问题:
使用watchObject.tempRoom是错误的语法——点语法只能访问固定字面量的属性名,若要通过变量tempRoom访问对应键,必须使用方括号watchObject[tempRoom]。原写法会去查找名为tempRoom的属性,该属性不存在则返回undefined,调用push自然会报TypeError: Cannot read property 'push' of undefined。
正确实现代码
基础if-else版本
var watchObject = {}; // 假设data.room和data.videoId已在别处定义 if (data.room in watchObject) { watchObject[data.room].push(data.videoId); } else { // 关键:新键对应的值要初始化为包含videoId的数组 watchObject[data.room] = [data.videoId]; }
简洁版(逻辑短路初始化)
可以省略if-else判断,直接用逻辑短路确保数组存在后再push:
var watchObject = {}; // 若键不存在则初始化为空数组,存在则保留原数组 watchObject[data.room] = watchObject[data.room] || []; watchObject[data.room].push(data.videoId);
内容的提问来源于stack exchange,提问作者Ethan Gordon
相关产品推荐
相关产品推荐

