美文网首页
浅拷贝和深拷贝

浅拷贝和深拷贝

作者: 晚安多巴胺 | 来源:发表于2018-05-17 21:20 被阅读0次

    数组的深拷贝和浅拷贝

    浅拷贝:
    var arr = ["One","Two","Three"];

    var arrto = arr;
    arrto[1] = "test";
    document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,test,Three
    document.writeln("数组的新值:" + arrto + "<br />");//Export:数组的新值:One,test,Three

    像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变

    方法0
    for 循环实现数组的深拷贝
    var arr = [1,2,3,4,5]
    var arr2 = copyArr(arr)
    function copyArr(arr) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
    res.push(arr[i])
    }
    return res
    }

    方法一:js的slice函数

    对于array对象的slice函数,
    返回一个数组的一段。(仍为数组)
    arrayObj.slice(start, [end])
    参数
    arrayObj
    必选项。一个 Array 对象。
    start
    必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。
    end
    可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。
    说明
    slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
    slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。

    举个栗子🌰
    var arr = ["One","Two","Three"];

    var arrtoo = arr.slice(0);
    arrtoo[1] = "set Map";
    document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
    document.writeln("数组的新值:" + arrtoo + "<br />");//Export:数组的新值:One,set Map,Three

    方法二:js的concat方法
    concat() 方法用于连接两个或多个数组。
    该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    语法
    arrayObject.concat(arrayX,arrayX,......,arrayX)
    说明
    返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
    var arr = ["One","Two","Three"];

    举个栗子🌰
    var arrtooo = arr.concat();
    arrtooo[1] = "set Map To";
    document.writeln("数组的原始值:" + arr + "<br />");//Export:数组的原始值:One,Two,Three
    document.writeln("数组的新值:" + arrtooo + "<br />");//Export:数组的新值:One,set Map To,Three

    方法三
    ES6扩展运算符实现数组的深拷贝
    var arr = [1,2,3,4,5]
    var [ ...arr2 ] = arr
    arr[2] = 5
    console.log(arr)
    console.log(arr2)

    对象的深拷贝和浅拷贝

    方法0
    万能的for循环实现对象的深拷贝

    var obj = {
    name: 'FungLeo',
    sex: 'man',
    old: '18'
    }
    var obj2 = copyObj(obj)
    function copyObj(obj) {
    let res = {}
    for (var key in obj) {
    res[key] = obj[key]
    }
    return res
    }

    方法一

    转换成json再转换成对象实现对象的深拷贝

    var obj = {
    name: 'FungLeo',
    sex: 'man',
    old: '18'
    }
    var obj2 = JSON.parse(JSON.stringify(obj))

    方法二
    扩展运算符实现对象的深拷贝

    var obj = {
    name: 'FungLeo',
    sex: 'man',
    old: '18'
    }
    var { ...obj2 } = obj
    obj.old = '22'
    console.log(obj)
    console.log(obj2)

    补充一个数组去重的方法

    function dedupe(array) {
    return [...new Set(array)]
    }
    var arr = [1,2,2,3,3,4,4,5,5]
    console.log(dedupe(arr))

    大佬原文链接https://blog.csdn.net/FungLeo/article/details/54931379

    自己在写微信小程序的时候遇见了,数组里面套对象的情况,拷贝数组之后,改变了里面对象的属性,查了网上的深拷贝数组的方法,发现无软用,无意中意识到,里面的对象是浅拷贝,随将二者合一

    栗子🌰
    var list = that.data.list;
    var liss = copyArr(list)
    function copyArr(arr){
    var res = []
    for (var i = 0;i < arr.length; i++){
    var {...obj} = arr[i]
    res.push(obj)
    }
    return res
    }

    相关文章

      网友评论

          本文标题:浅拷贝和深拷贝

          本文链接:https://www.haomeiwen.com/subject/mepidftx.html