JS 深克隆和浅克隆 浅析

        深克隆(Deep Clone)和浅克隆(Shallow Clone)是在复制对象或数组时常用的两种概念。它们主要区别在于复制的深

深克隆(Deep Clone):

        深克隆是指完全复制一个对象或数组,包括对象或数组中的所有嵌套对象或数组。在深克隆中,复制的结果是一个全新的对象或数组,与原始对象或数组完全独立,修改复制后的对象或数组不会影响原始对象或数组。深克隆会递归复制所有嵌套的对象或数组,确保每个对象或数组都是独立的。

浅克隆(Shallow Clone):

        浅克隆是指复制一个对象或数组,但只复制对象或数组的第一层结构,而不会复制嵌套的对象或数组。在浅克隆中,复制的结果仅包含原始对象或数组的引用,而不是深层的复制。因此,修改复制后的对象或数组的第一层结构可能会影响原始对象或数组。

        总结起来,深克隆会复制对象或数组的所有层级,确保每个对象或数组都是独立的,而浅克隆只会复制第一层结构,复制的结果包含原始对象或数组的引用。

深克隆方法:

  • 利用JSON序列化和反序列化
const originalArray = [1, 2, [3, 4]];
const deepCloneArray = JSON.parse(JSON.stringify(originalArray));

originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素

console.log(originalArray); // [1, 2, [300, 4]]
console.log(deepCloneArray); // [1, 2, [3, 4]],不受原数组修改的影响

  • 使用递归
function deepCloneArray(arr) {
    let clone = [];
    arr.forEach(item => {
        if (Array.isArray(item)) {
            clone.push(deepCloneArray(item));
        } else {
            clone.push(item);
        }
    });
    return clone;
}

const originalArray = [1, 2, [3, 4]];
const deepCloneArray = deepCloneArray(originalArray);

originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素

console.log(originalArray); // [1, 2, [300, 4]]
console.log(deepCloneArray); // [1, 2, [3, 4]],不受原数组修改的影响
  • 使用Lodash库
const _ = require('lodash');
const deepClone = (arr) => {
  return _.cloneDeep(arr);
}
  • 使用Map函数
function deepCloneArray(array) {
    return array.map(item => {
        if (Array.isArray(item)) {
            return deepCloneArray(item); // 递归调用深克隆函数
        } else if (typeof item === 'object' && item !== null) {
            return deepCloneObject(item); // 递归调用深克隆函数
        } else {
            return item; // 基本数据类型直接返回
        }
    });
}

function deepCloneObject(obj) {
    let clonedObj = {};
    for (let key in obj) {
        if (Array.isArray(obj[key])) {
            clonedObj[key] = deepCloneArray(obj[key]); // 对数组进行深克隆
        } else if (typeof obj[key] === 'object' && obj[key] !== null) {
            clonedObj[key] = deepCloneObject(obj[key]); // 对对象进行深克隆
        } else {
            clonedObj[key] = obj[key]; // 基本数据类型直接复制
        }
    }
    return clonedObj;
}

// 示例
const originalArray = [1, 2, [3, 4], {a: 5, b: [6, 7]}];
const clonedArray = deepCloneArray(originalArray);

console.log(originalArray); // 原始数组
console.log(clonedArray); // 深克隆后的数组

浅克隆方法:

  • 直接赋值
  • 使用slice()方法
const originalArray = [1, 2, [3, 4]];
const shallowCloneArray = originalArray.slice();

originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素

console.log(originalArray); // [1, 2, [300, 4]]
console.log(shallowCloneArray); // [1, 2, [300, 4]],受原数组修改的影响
  • 使用concat()方法
const originalArray = [1, 2, [3, 4]];
const shallowCloneArray = originalArray.concat();

originalArray[2][0] = 300; // 修改原数组的第三个元素中的第一个元素

console.log(originalArray); // [1, 2, [300, 4]]
console.log(shallowCloneArray); // [1, 2, [300, 4]],受原数组修改的影响
  • 使用扩展操作符
const shallowClone = (arr) => {
  return [...arr];
}
  • 使用Array.from方法
const shallowClone = (arr) => {
  return Array.from(arr);
}
  • 使用Object.assign()方法
const shallowClone = (arr) => {
  return Object.assign([], arr);
}
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP(传输控制协议)是一种面向连接的协议,用于在网络上可靠地传输数据。它提供了数据的可靠传输、流量控制和拥塞控制等功能,是互联网的核心协议之一。 在Node.js中,使用内置的net模块可以轻松地创建TCP服务器和客户端。下面是一个简单的TCP服务器示例: ```javascript const net = require('net'); const server = net.createServer((socket) => { console.log('client connected'); socket.on('data', (data) => { console.log(`received data: ${data}`); socket.write(`echo: ${data}`); }); socket.on('close', () => { console.log('client disconnected'); }); }); server.listen(3000, () => { console.log('server started on port 3000'); }); ``` 这个服务器会监听本地的3000端口,当有客户端连接时,会打印出“client connected”的信息。当客户端发送数据时,服务器会收到这些数据并将其打印到控制台上,然后将“echo: ”加在数据前发送回客户端。当客户端断开连接时,服务器会打印“client disconnected”的信息。 下面是一个简单的TCP客户端示例: ```javascript const net = require('net'); const client = new net.Socket(); client.connect(3000, 'localhost', () => { console.log('connected to server'); client.write('hello, server'); }); client.on('data', (data) => { console.log(`received data: ${data}`); client.destroy(); }); client.on('close', () => { console.log('disconnected from server'); }); ``` 这个客户端会连接到本地的3000端口,并发送“hello, server”的消息。当客户端收到服务器的响应时,会打印出这些数据,并断开连接。 总的来说,TCP在网络通信中扮演着非常重要的角色,Node.js内置的net模块提供了简单易用的TCP套接字接口,使得我们可以轻松地创建TCP服务器和客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值