null需单独判断,因其typeof为"object"却不可遍历或调用object方法,必须在深拷贝函数开头用obj === null显式拦截并返回,避免误入对象分支导致错误。

在手写 JavaScript 深拷贝时,null 是一个必须单独处理的特殊值——它 typeof 返回 "object",但本身既不是对象也不是基本类型,而是一个独立的原始值。如果不显式判断,容易被误当作普通对象递归处理,导致报错或逻辑错误。
为什么 null 需要单独判断
null 是 JavaScript 中唯一一个 typeof 为 "object" 却不能调用 Object.prototype.toString 或遍历属性的值。例如:
-
typeof null === "object"(历史遗留 bug) -
Object.keys(null)抛出TypeError -
for...in null不执行循环体,但后续操作可能出错
常见深拷贝中对 null 的处理方式
应在入口处优先判断,直接返回原值,避免进入对象/数组分支:
if (val === null) return null;- 放在类型判断最前面,比
typeof val === "object"更早拦截 - 注意不要写成
!val,否则会把0、false、""等 falsy 值一并误判
完整示例中的关键位置
一个最小可用的手写深拷贝片段中,null 判断通常出现在开头:
function deepClone(obj) {
if (obj === null) return null; // ✅ 必须先处理
if (typeof obj !== "object") return obj;
if (Array.isArray(obj)) return obj.map(item => deepClone(item));
const result = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
扩展考虑:undefined 和其他边界值
null 虽需特殊处理,但 undefined 可直接返回(无需 clone),而 Date、RegExp 等引用类型也建议单独识别:
if (obj === undefined) return undefined;if (obj instanceof Date) return new Date(obj);if (obj instanceof RegExp) return new RegExp(obj);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











