浅拷贝和深拷贝
本课属于 Coddy JavaScript 学习旅程的“逻辑与流程”单元。第 25 课,共 65 课。
复制对象时,有两种复制方式:
- 浅拷贝:只复制第一层
- 深拷贝:复制所有嵌套层
浅拷贝方法:
使用展开运算符:
const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };使用 Object.assign(),通过将属性从源对象复制到目标对象来创建一个新对象:
const assignCopy = Object.assign({}, original);浅拷贝的问题:
original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (嵌套对象共享同一个引用)
console.log(assignCopy.b.x); // 3理解 JSON 方法与深拷贝
JSON.stringify() 可以将 JavaScript 对象转换为 JSON 字符串:
const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"JSON.parse() 会将 JSON 字符串转换回 JavaScript 对象:
const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }使用 JSON 进行深拷贝:
const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));
original.b.x = 3;
console.log(deepCopy.b.x); // 2(完全独立)挑战
简单创建一个名为 processCart 的函数,它接收一个表示购物车的 JSON 字符串。购物车包含一个由商品名称和价格组成的数组。你的任务是:
- 将 JSON 字符串解析为 JavaScript 对象
- 从中创建两个单独的购物车
- 在第二个购物车中:
- 为每件商品添加一个
discounted属性,并将其设为 false - 为所有
price大于 50 的商品打九折 - 将已打折商品的 'discounted' 设为 true
- 为每件商品添加一个
- 返回一个包含两个购物车的数组
亲手试试
function processCart(jsonString) {
// 在这里编写代码
}
// 不要在函数外编写任何内容这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: JavaScript 在线编译器