JavaScript删除对象时报TypeError:无法将undefined/null转为对象求助
删除对象属性时遇到TypeError的解决方法
当前rooms初始为空对象,数据由其他代码动态添加。尝试删除指定属性时触发错误:
TypeError: Cannot convert undefined or null to object
错误来自代码行:delete rooms?.[roomId]?.[socket.id];
原代码如下:
interface IDevice { deviceId: string; deviceName?: string; socketId: string; isReconnecting?: true | false; } const rooms: Record<string, Record<string, IDevice>> = {}; if (typeof rooms?.[roomId]?.[socket.id] !== 'undefined' && rooms?.[roomId]?.[socket.id] !== null) { delete rooms?.[roomId]?.[socket.id]; }
问题原因
虽然用了可选链?.简化判断,但delete操作符不能直接作用于undefined或null。如果rooms[roomId]本身不存在(即返回undefined),rooms?.[roomId]?.[socket.id]会返回undefined,此时执行delete undefined就会触发类型错误——因为delete只能用于操作对象的属性,不能直接操作非对象值。
解决方案
需要逐层确认父级对象的存在性,确保要删除的属性位于一个有效对象内,再执行删除操作:
interface IDevice { deviceId: string; deviceName?: string; socketId: string; isReconnecting?: true | false; } const rooms: Record<string, Record<string, IDevice>> = {}; // 先确认roomId对应的子对象存在,再检查目标属性是否存在 if (rooms[roomId] && rooms[roomId][socket.id]) { delete rooms[roomId][socket.id]; // 可选优化:如果删除后该房间无设备,清理空房间对象 if (Object.keys(rooms[roomId]).length === 0) { delete rooms[roomId]; } }
说明
- 先判断
rooms[roomId]是否为有效对象,避免后续操作在undefined上进行; - 再确认目标属性
rooms[roomId][socket.id]存在,保证删除操作有意义; - 可选的空房间清理步骤可以避免
rooms中残留空对象,保持数据结构整洁。
内容的提问来源于stack exchange,提问作者Jerry Seigle
相关产品推荐
相关产品推荐

