null赋值不删除属性,仅设值为null;delete才真正移除属性。赋null后"in"和hasOwnProperty仍返回true,JSON序列化保留键;delete后键不存在,in返回false,JSON不输出该键。

在 JavaScript 中,null 并不是“删除属性”的手段,它只是将属性值设为 null,而该属性依然存在于对象中;真正移除属性要用 delete 操作符。
Null 赋值 ≠ 属性被删除
给对象属性赋值为 null,只是改变了它的值,属性本身仍在对象的自有属性列表里:
const obj = { name: "Alice" };-
obj.name = null;→ 此时"name" in obj仍为true,obj.hasOwnProperty("name")也返回true -
JSON.stringify(obj)会输出{"name":null},说明属性参与序列化
delete 才真正移除属性
delete 会从对象中彻底移除键(属性),之后该属性不再存在:
const obj = { age: 30 };-
delete obj.age;→"age" in obj变为false,obj.age是undefined -
delete返回true表示删除成功(对不可配置属性可能返回false) -
JSON.stringify(obj)输出{},因为该属性已不存在
实际使用中的常见误区
开发者有时混淆 null 和“无”或“不存在”,导致逻辑出错:
立即学习“Java免费学习笔记(深入)”;
- 用
obj.prop == null判断属性是否“无效”,虽能同时捕获null和undefined,但无法区分是未定义、被删、还是显式设为null - 想清空对象状态时,误用
obj = null—— 这只是让变量指向null,原对象若还有其他引用,仍可访问 - 在循环中动态删属性,需注意
for...in遍历时,已删除的属性不会出现,但赋null的仍会遍历到
推荐做法:按意图选择操作
明确你要达成的效果,再决定用哪种方式:
- 想表示“有这个字段,但当前值为空” → 赋
null或undefined - 想让对象结构更干净、避免冗余键、影响
Object.keys()或序列化 → 用delete - 批量清空对象所有属性 → 可用
Object.keys(obj).forEach(key => delete obj[key]),或直接重新赋值为空对象(注意引用关系)


















