使用Object.prototype.toString.call(obj)進行对象的深拷贝

305 阅读1分钟

一般我們使用typeof obj === "object"检测”obj”是否为对象

但是這種檢測有一定的缺點, 用 typeof 是否能准确判断一个对象变量,答案是否定的,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 "纯粹" 的 object 对象。如何避免呢?

其實比較好的方式就是

Object.prototype.toString.call(obj) === "[object Object]

這裏我們寫一個對象深拷貝的方法:

function deepCopy ( p, c ) {
    //还需要判断c是否为空对象或空数组,其他类型抛出错误
    let obj = c||{};
    if (p) {
        for (let i in p) {
            if (typeof(p[i]) === 'object'&&Object.prototype.toString.call(p[i])!=="[object Null]") {
                obj[i] = (p[i].constructor === Array ? [] : {});
                deepCopy( p[i], obj[i] );
            } else {
                obj[i] = p[i];
            }
        }
        return obj;
    }
    return '';
}

楼主是一个前端入职半年多的新人,请大家多多关照,多多指点。谢谢