You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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];
    }
}

说明

  1. 先判断rooms[roomId]是否为有效对象,避免后续操作在undefined上进行;
  2. 再确认目标属性rooms[roomId][socket.id]存在,保证删除操作有意义;
  3. 可选的空房间清理步骤可以避免rooms中残留空对象,保持数据结构整洁。

内容的提问来源于stack exchange,提问作者Jerry Seigle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:55:13