JavaScript 深浅拷贝?
时间: 2023-11-18 16:05:46 浏览: 38
深拷贝和浅拷贝是 JavaScript 中常用的两种对象复制方法。
浅拷贝只会复制对象的一层属性,如果对象的属性值是一个引用类型,那么只会复制这个引用,两个对象会共享同一个引用类型的属性。常见的浅拷贝方法有 Object.assign() 和展开运算符(...)。
深拷贝则会复制整个对象,并且每个属性值都会被复制一份,不会共享同一个引用类型的属性。常见的深拷贝方法有 JSON.parse(JSON.stringify(obj)) 和递归复制对象属性。
需要注意的是,使用 JSON.parse(JSON.stringify(obj)) 进行深拷贝时,如果对象中含有函数、RegExp 等类型的属性,会被转成 null。另外,如果对象中存在循环引用,也会导致 JSON.stringify() 函数报错。
相关问题
JavaScript中实现深浅拷贝的方法
JavaScript中实现深浅拷贝的方法:
浅拷贝:
1. Object.assign(target, ...sources):将所有可枚举属性的值从一个或多个源对象复制到目标对象,返回目标对象。
2. 扩展运算符(...):将一个对象的所有可枚举属性拷贝到另一个对象中。
深拷贝:
1. JSON.parse(JSON.stringify(obj)):将对象序列化为JSON字符串,再将JSON字符串反序列化为新的对象,实现深拷贝。但是该方法有一些限制,比如无法拷贝函数、正则表达式等特殊对象。
2. 递归拷贝:遍历对象的每一个属性,如果属性值是对象,则递归拷贝该对象。
lua closure factory 完整代码:
function createClosureFactory()
local count = 0
return function()
count = count + 1
return function()
return count
end
end
end
local closureFactory = createClosureFactory()
local closure1 = closureFactory()
local closure2 = closureFactory()
print(closure1()) -- 输出 1
print(closure2()) -- 输出 2
中文加密:
中文加密可以使用一些加密算法,比如AES、DES等。具体实现可以参考相关的加密库或者自己实现。需要注意的是,加密算法的安全性和加密密钥的保密性非常重要,不能随意泄露。
深浅拷贝
深拷贝和浅拷贝都是常见的复制数据的方式。
浅拷贝只会复制对象的第一层属性,如果对象属性值是一个引用类型,那么复制的是该引用类型的地址,也就是说,新对象和原对象的该引用类型的属性指向同一个内存地址。当原对象的该引用类型的属性值发生变化时,新对象也会受到影响,因为它们指向的地址是相同的。
深拷贝则会递归地复制对象及其所有嵌套的属性,直到所有属性都是基本类型或不可变类型时才停止。这样,新对象和原对象的所有属性都指向不同的内存地址,互不影响。
实现深拷贝的方式有很多,以下列举几种:
1. 使用JSON.parse和JSON.stringify方法:先将对象转为字符串,然后再将字符串转回对象,这样可以实现深拷贝,但是有一些限制,比如不能复制函数、正则表达式等特殊类型的数据。
```javascript
let newObj = JSON.parse(JSON.stringify(oldObj));
```
2. 使用递归函数:遍历对象的所有属性,如果属性值是对象,则递归调用该函数进行复制,这样可以实现完整的深拷贝。
```javascript
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
```
以上列举了常见的深拷贝和浅拷贝的方式,具体使用哪种方式取决于实际需求。