前端拷贝问题

前端拷贝

  1. 类型

    • 浅拷贝: 只拷贝一层的拷贝方式,地址拷贝
    • 深拷贝: 值的完全拷贝
  2. 浅拷贝实现

    • 解构赋值
    • Object.assign
    • 引用类型直接赋值
  3. 深拷贝实现

    • JSON.parse / JSON.string [ 序列化 / 反序列化 ]
    • 递归实现深拷贝 - 要求: 手写出来
      //对象深拷贝
        function deepClone(origin,target){
            //target是否存在如果不存在创建空对象
            let tar = target || {},
            //判断是否为引用数据类型
                toStr = Object.prototype.toString,
                arrType='[object Array]';
    
            for(let key in origin){
                //剥离原型链的数据
                if(origin.hasOwnProperty(key)){
                    //判断是否为引用数据类型 对象或数组
                    if(typeof(origin[key]) === 'object' && origin[key] !== null){
                        if(toStr.call(origin[key]) === arrType ){
                            tar[key] = [];
                        }else{
                            tar[key] = {};
                        }
                        deepClone(origin[key],tar[key]);
                    }else{
                        tar[key] = origin[key];
                    }
                }
            }
            return tar;
        }
    
    • 第三方
      • loadsh
        • _.cloneDeep()
      • Immutable.js 【 性能最好的 】
      • const _ = require( ‘loadsh’ )

immutable_demo

const state = {
str: ‘MMR’,
obj: {
x: 1,
y: 2
},
arr: [1,2,3 ]
}

const newState = _.cloneDeep( state ) // 这种方式逐层递归,要遍历每一个节点,是很消耗性能的

newState.str = “路过的假面骑士MMR”
newState.obj.x = 1000
newState.arr[ 0 ] = 2000
console.log( state )

/*

  • node.js文件
    • Common.js 规范

*Map是用来定义Immutable对象

*/

const { Map } = require(‘immutable’)

/* Map作用就是可以帮助我们创建一个 Immutable 对象 */

var obj = { name: ‘MMR’ } // state.name

const state = Map({ // 它是可用的但是是不可变的
id: 1,
name: ‘MMR’,
obj: {
x: 1,
y: 2
}
})

/* 每一次的改变都会生成新的immutable对象 */

const newState = state.set(‘age’, 20 ) // 新的immutable对象

// console.log( state === newState ) false

// console.log( state.get(‘name’) )
// console.log( newState.get(‘name’) )

const state2 = newState.set(‘name’,‘路过的假面骑士MMR’)

console.log( newState.get(‘name’) )
console.log( state.get(‘name’) )
console.log( state2.get(‘name’) )
console.log( Map.isMap( state2 ))
console.log( Map.isMap( obj ))

const { List } = require( ‘immutable’ )

/*

* List是用来定义Immutable数组的

*/

const arr = List([ 1,2,3,4 ]) // immutable数组

const newArr = arr.push( 5 ) // 通过数组的方法来生成新的Immutable数组

console.log( arr.get[ 0 ] ) // undefined
console.log( newArr.get[ 4 ] ) // undefined

console.log( arr.get( 0 ) ) // 1
console.log( newArr.get( 4 ) ) // 5

console.log( arr.size ); // 4 size输出的是immutable数组长度
console.log( newArr.size ); // 5

/*

is 可以帮助我们比较两个immutable对象里面内容是否相同

*/

const { Map,is,List } = require(‘immutable’)

const state1 = Map({
a: 1,
b: true,
c: null,
d: undefined,
})

const state2 = Map({
a: 1,
b: true,
c: null,
d: undefined,
e: ‘a’
})

console.log( is( state1,state2 ) )

const arr = List([1, ‘a’, true,null, undefined])
const arr2 = List([1, ‘a’, true,null, undefined])

console.log( is( arr,arr2 ) )

// var arr = [ 1, ‘a’, true,null, undefined ]
// var arr2 = [ 1, ‘a’, true,null, undefined ]

// console.log( arr.sort().toString() === arr2.sort().toString() )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值