网站首页 > 基础教程 正文
JavaScript 的原始数据类型,例如数字、字符串、null、未定义和布尔值是不可变的,这意味着它们的值一旦创建就不能改变。但是,对象和数组是可变的,允许在创建后更改它们的值。这在实践中意味着原语是按值传递的,而对象和数组是通过引用传递的。考虑以下示例:
let str = 'Hello';
let copy = str;
copy = 'Hi';
// str = 'Hello', copy = 'Hi'
let obj = { a: 1, b: 2 };
let objCopy = obj;
objCopy.b = 4;
// obj = { a: 1, b: 4}, objCopy = { a: 1, b: 4 }
在 of 中发生是对象通过引用传递给 obj的objCopy,因此更改其中一个变量的值也会影响另一个。objCopy实际上是引用同一对象的别名。我们可以通过克隆对象来解决这个问题,可以使用各种技术克隆,例如扩展运算符 ( ...) 或Object.assign()使用空对象:
let obj = { a: 1, b: 2};
let clone = { ...obj };
clone.b = 4;
// obj = { a: 1, b: 2}, clone = { a: 1, b: 4 }
let otherClone = Object.assign({}, obj);
otherClone.b = 6;
clone.b = 4;
// obj = { a: 1, b: 2}, otherClone = { a: 1, b: 6 }
这两种解决方案都展示了浅克隆的示例,因为它们适用于外部(浅)对象,但如果我们有嵌套(深)对象,最终将通过引用传递则失败。像往常一样,有一些方法可以解决这个问题,其中更简单的是使用JSON.stringify()和JSON.parse()处理这种情况:
let obj = { a: 1, b: { c: 2 } };
let clone = JSON.parse(JSON.stringify(obj));
clone.b.c = 4;
// obj = { a: 1, b: { c: 2 }}, clone = { a: 1, b: { c: 4 } }
虽然上面的示例有效,但它必须对整个对象进行序列化和反序列化,这会明显影响代码的性能,因此它可能不适合较大的对象或性能很重要的项目。
或者,您可以使用递归函数来深度克隆对象,此方案速度更快,例如 deepClone 片段中的那个。同样,如果您想要一个现成的浅克隆功能,您可以在后面 shallowClone 的文章中找到一个。
???
猜你喜欢
- 2024-10-12 HTML编辑器从WORD复制粘贴图片 html复制粘贴快捷键
- 2024-10-12 一文讲解关于jQuery语法 jquery的语法
- 2024-10-12 19、深拷贝浅拷贝的区别?如何实现一个深拷贝?
- 2024-10-12 14个jQuery 实时搜索插件,用了都说好!
- 2024-10-12 如何复制WORD的图文到富文本框编辑器中自动上传
- 2024-10-12 提高Web开发速度技巧 提高web开发速度技巧是什么
- 2024-10-12 不要被误导了:JavaScript深拷贝的5种方法
- 2024-10-12 AJAX with JSP使用jQuery示例 简要说明jquery中的ajax方法使用
- 2024-10-12 30、jQuery 的属性拷贝的实现原理是什么,如何实现深浅拷贝?
- 2024-10-12 我的更多网页前端开发文章目录列表2019年5月17日【000】
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)