本文目录一览:
- 1、JavaScript中浅拷贝和深拷贝的区别和实现
- 2、js实现深拷贝的几种方法
- 3、js对象浅拷贝有那些方法呢?
- 4、JS中实现深拷贝的几种方法(object,Array)
- 5、JS中如何进行对象的深拷贝
- 6、JavaScript怎样进行真正有效的对象拷贝
JavaScript中浅拷贝和深拷贝的区别和实现
浅拷贝只是拷贝了引用, 数据在内存中还是一个, 如果引用的对象发生了变化, 该变量也会同步变化.
深拷贝相当于把内存上的数据拷贝了一份, 此时修改该变量不会影响原来的变量, 同理修改原来的变量也不会影响现在的变量.
浅拷贝:
const foo = { bar: 'bar', baz: 'baz' }
const ref_foo = foo
深拷贝(最简单的方法, 拷贝性能也不弱):
const foo = { bar: 'bar', baz: 'baz' }
const ano_foo = JSON.parse(JSON.stringify(foo))
js实现深拷贝的几种方法
简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。
浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。
使用 js ON.stringify和 js ON.parse实现深拷贝:JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象;
缺陷:它会抛弃对象的 const ructor,深拷贝之后,不管这个对象原来的构造 函数 是什么,在深拷贝之后都会变成Object;这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON;
递归拷贝实现深拷贝,解决循环引用问题
js对象浅拷贝有那些方法呢?
1、首先可以通过Object.assign来解决这个问题,很多人认为这个函数是用来深拷贝的。其实并不是,Object.assign只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,所以并不是深拷贝。
2、还可以通过展开运算符...来实现浅拷贝
let a = {age: 1}
let b = { ...a }
a.age = 2
console.log(b.age) // 1
JS中实现深拷贝的几种方法(object,Array)
4.通过第三方工具实现深拷贝
lodash.cloneDeep
数组深拷贝
1. concat(arr1, arr2,....)
2. slice(idx1, idx2)
参数可以省略
1)没有参数是拷贝数组
2)只有一个参数是从该位置起到结束拷贝数组元素
3)两个参数,拷贝从起始位置到结束位置的元素(不包含结束位置的元素:含头不含尾)
注意:当数组中的元素均为一维是深拷贝
数组中元素一维以上是值的引用
JS中如何进行对象的深拷贝
//拷贝数据,深拷贝数据,绝对不会出现对象与数组引用相同位置
var copyData = function(item) {
if(item == null) {
return null;
}
if($.isArray(item)) {
var newArray = [];
for(var i=0;iitem.length;i++) {
newArray.push(copyData(item[i]));
}
return newArray;
}
if($.isPlainObject(item)) {
var newObj = {};
for(var p in item) {
newObj[p] = copyData(item[p]);
}
return newObj
}
return item;
}
JavaScript怎样进行真正有效的对象拷贝
有效的对象拷贝应该是指深拷贝。
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!
深拷贝:就是重新复制一块内存,这样就不会互相影响。
有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。
这个时候我们会用到深拷贝。
深拷贝的方法:
var deepCopy = function(source)
{
var result;
(source instanceof Array) ? (result = []) : (result = {});
for (var key in source) {
result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key];
}
return result;
}