JS中Lodash的_.unset为何会在调用前就修改目标对象?
核心原因
这个现象和 Lodash 的 _.unset 逻辑无关,是浏览器控制台的惰性求值特性导致的认知偏差:
- 对于对象、数组这类引用类型的值,
console.log执行时不会输出该值当前状态的完整快照,只会在控制台存储对象的内存引用 - 你调用
_.unset会直接修改原this.current_query指向的对象,当你后续手动点击控制台展开该打印条目时,浏览器才会根据引用读取对象当前的状态(也就是属性已经被删除的空对象),视觉上就像_.unset在调用前就已经生效 - 换成
_.omit时逻辑完全不同:_.omit不会修改原对象,而是返回一个全新的对象赋值给this.current_query,你在赋值前打印的原对象引用指向的内存内容一直没有被修改,展开时自然会显示预期的初始值
验证方案
你可以通过打印瞬时快照的方式验证 _.unset 调用前的真实状态:
on_applied_option_click(field){ // 序列化后再打印,直接输出当前状态的快照,不受后续修改影响 console.log(JSON.parse(JSON.stringify(this.current_query))); _.unset(this.current_query, field); console.log(JSON.parse(JSON.stringify(this.current_query))); }
也可以直接打印具体的属性值,避免引用的干扰:
// 执行 _.unset 前打印一定是 500,符合预期 console.log(this.current_query.test);
内容的提问来源于stack exchange,提问作者Luca Reghellin
相关产品推荐
相关产品推荐

