js実装コピー

4048 ワード

浅いコピー
浅いコピーは、最も外側のレイヤにのみコピーされます.つまり、ポインタのみがコピーされ、コンテンツはコピーされません.
浅いコピーを実現する方法は次のとおりです.
1、Object.assign
var obj = {
    a: 1,
    b: {
        c: 1
    }
}
var objCopy = Object.assign({},obj);
console.log(obj === objCopy)  //    false
console.log(obj.b === objCopy.b)  //    true
objCopy.b.c = 2; 
console.log(obj.b.c)  //   2  obj       
2、$.extend
var obj = {
    a: 1,
    b: {
        c: 1
    }
}
var objCopy = $.extend(false,{},obj);
console.log(obj === objCopy)  //    false
console.log(obj.b === objCopy.b)  //    true
objCopy.b.c = 2; 
console.log(obj.b.c)  //   2  obj       

3、

function copy(src) {
    if (typeof src !== 'object') {
        return src;
    }
    var dest = {};
    for(var p in src) {
        if (Object.prototype.toString.call(src[p]) ==='[object RegExp]') {
	    var exp = new RegExp(src[p].source,src[p].flags)
	    dest[p] = exp;
	} else {
	    dest[p] = src[p];
	}
    }
    return dest;
}

, 。


1、$.extend

var obj = {
    a: 1,
    b: {
        c: 1
    }
}
var objCopy = $.extend(true,{},obj);
console.log(obj === objCopy)  //    false
console.log(obj.b === objCopy.b)  //    false
objCopy.b.c = 2; 
console.log(obj.b.c)  //   1  obj        

$.extend , __proto__ , __proto__ Object.prototype。

function Obj() {
    this.name = "tom";
    this.age = 18;
}
Obj.prototype.say = function() {
    console.log("hello");
}
var obj = new Obj();
var objCopy = $.extend(true,{},obj);
console.log(obj.__proto__ === Obj.prototype)  //   true
console.log(objCopy.__proto__ === Obj.prototype)  //   false
console.log(obj.__proto__ === Object.prototype) //   false
console.log(objCopy.__proto__ === Object.prototype) //   true


var obj = {
    a: 1,
    b: {
	c: 1
    }
}
var objCopy = {}
objCopy.a = obj;
obj.d = objCopy;
var s = $.extend(true,{},obj); // Uncaught RangeError: Maximum call stack size exceeded

2、 (JSON.stringify JSON.parse)

var obj = {
    a: 1,
    b: {
        c: 1
    }
}
var objCopy = JSON.parse(JSON.stringify(obj))
console.log(obj === objCopy)  //    false
console.log(obj.b === objCopy.b)  //    false
objCopy.b.c = 2; 
console.log(obj.b.c)  //   1  obj        
var dd = {}
dd.a = obj;
obj.d = dd;
JSON.stringify(obj);  //Uncaught TypeError: Converting circular structure to JSON

, 、RegExp json , 。 $.extend 。

3、

function copy(isDeep,src) {
    if (typeof src !== 'object') {
        return src;
    }
    var dest = {};
    for(var p in src) {
        if (Object.prototype.toString.call(src[p]) ==='[object RegExp]') {
            var exp = new RegExp(src[p].source,src[p].flags)
            dest[p] = exp;
        } else {
            if (typeof src[p] === 'object' && isDeep) {
                dest[p] = copy(isDeep,src[p]);
            } else {
                dest[p] = src[p];
            }
        }
    }
    return dest;
}
var obj = {
    a: 1,
    b: {
        c: 1
    }
}
var objCopy =copy(true, obj)
console.log(obj === objCopy)  //    false
console.log(obj.b === objCopy.b)  //    false
objCopy.b.c = 2; 
console.log(obj.b.c)  //   1  obj        

, (enumerable: false)の 、この はコピーされません.2つの オブジェクトに すると、 が されます.
2つのオブジェクトが いに される 、 はほとんど しませんので、この は しません.