js実装コピー
4048 ワード
浅いコピー
浅いコピーは、最も外側のレイヤにのみコピーされます.つまり、ポインタのみがコピーされ、コンテンツはコピーされません.
浅いコピーを実現する方法は次のとおりです.
1、Object.assign
浅いコピーは、最も外側のレイヤにのみコピーされます.つまり、ポインタのみがコピーされ、コンテンツはコピーされません.
浅いコピーを実現する方法は次のとおりです.
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つのオブジェクトが いに される 、 はほとんど しませんので、この は しません.