• JS深拷贝和浅拷贝


       对于字符串类型 ,浅拷贝就是对值的复制

      对于对象来说,浅拷贝就是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变

    而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

    例如:

    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的值不变,不是吗?

    方法一:js的slice函数 

    var arr = ["One","Two","Three"];
    
    var arrtoo = arr.slice(0);    //从数组下标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

    原博文地址

  • 相关阅读:
    多线程实现看病Test2
    多线程Test1
    实现注册的账户在重新运行程序后依然可以登录
    教资科一科二pdf资料+科三
    error Custom elements in iteration require 'v-bind:key' directives vue/valid-v-for
    vue-router配置路由出现错误: Mixed spaces and tabs no-mixed-spaces-and-tabs
    [vue-router] route config "component" for path:canot be a string id. Use an actual compone
    20 个超赞的 CSS3 库
    20个简洁的 JS 代码片段
    Vue 前端代码风格指南 |
  • 原文地址:https://www.cnblogs.com/qianxunpu/p/7542169.html
Copyright © 2020-2023  润新知