zoukankan      html  css  js  c++  java
  • Js中的深浅克隆

    一、数组的深浅克隆

      在js中,我们有时对数组进行操作时需要先对原有数组进行备份,如果只是通过将数组对象复制给一个变量,那么当改变新的数组的元素值时同时也会改变备份数组的值,这就是浅克隆。可以看下下面的例子:

    var arr1 = [1, 2, 3, 4, 5, 6];
    var arr2 = arr1;
    arr2[1] = 10;
    
    alert(arr1);//1,10,3,4,5,6
    
    alert(arr2);//1,10,3,4,5,6

    大多数时候,这不是我们希望的结果,那么能如何实现对原有数组的深度克隆呢?!这时我们可以通过数组对象的两个方法来实现:

    1、js的slice(a,[b])函数

      返回值也是一个数组,不过是进行了截取的数组。

    有两个参数

    a 必选项 表示开始位置的数组元素的索引

    b 可选项 表示结束位置的数组元素的索引(注:截取的数组包含该索引处的数组元素) 

    说明:

    slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。
    slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。
    var arr = ["One", "Two", "Three"];
    
    var arr2 = arr.slice(0);
    arr2[0] = "test";
    alert(arr);//"One", "Two", "Three"
    alert(arr2);//"test", "Two", "Three"

    2、js的Concat()方法

    concat()用于连接两个或多个数组

    该方法不会改变原有数组,紧紧会返回被连接数组的一个副本。

    语法:

    arrayObject.concat(arrayX,arrayX,......,arrayX)

    说明:

    返回一个新数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。

    var arr = ["One", "Two", "Three"];
    
    var arr2 = arr.concat();
    arr2[0] = "test";
    alert(arr);//"One", "Two", "Three"
    alert(arr2);//"test", "Two", "Three"

    二、对象的克隆

    对象的克隆就是把对象的属性遍历一遍然后赋值给新的对象

    var json = { a: 9, b: 8, c: {d:7,e:6}};
    
            var deepcopy = function (sourceObj)
            {
                var obj = {};
                for(var i in sourceObj)
                {
                    obj[i] = sourceObj[i];
                }
    
                return obj;
            }
    
    var res=deepcopy(json);
  • 相关阅读:
    selenium-Selense、脚本语法
    selenium常用命令
    百度自动化测试脚本制作
    day2
    day1
    Python核心编程3-正则表达式
    redis
    mysql与系统优化
    mysql之mha高可用及读写分离
    作业一
  • 原文地址:https://www.cnblogs.com/YanYongSong/p/5305405.html
Copyright © 2011-2022 走看看