js之数组克隆

js重要分基础数据范例援用数据范例两大类

基础数据范例包含:number,string,undefine,null,boolean,Symbol(es6新增)
援用数据范例:Object,Array,Function,Data等
注重:基础数据范例放在**栈空间内**,并且是按值寄存,能够直接读取和操纵。
      援用数据范例寄存在**堆空间内**(门),变量的值实际上是指向堆空间的地点(钥匙),因而假如克隆这个变量,相当于复制钥匙。

let arr = [1,2,3,4,5]
let arr1 = arr  // 这一步相当于把arr栈空间的地点赋给了arr1,实在arr和arr1操纵的是同一个堆空间的对象
arr1.push(6) // arr1 = [1,2,3,4,5,6]
console.log(arr) //[1,2,3,4,5,6]

因而关于援用范例的拷贝,须要拷贝堆空间的对象

数组浅拷贝
1.应用数组slice与concat要领返回一个新数组的特征

let arr = [1,2,3,4,5]
let arr1 = arr.slice() //[1,2,3,4,5]
let arr2 = arr.concat() //[1,2,3,4,5]

2.简朴粗犷的要领-遍历

let arr = [1,2,3,4,5]
let arr2 = []
arr.forEach(item=>{
    arr2.push(item)
    }
)
console.log(arr2)

3.es6新增要领-拓展运算符

let arr = [1,2,3,4,5]
let arr1 = [...arr] //[1,2,3,4,5]

4.es6新增要领-Object.assign
let arr = [1,2,3,4,5]
let arr1 = []
Object.assign(arr1,arr)
console.log(arr1) //[1,2,3.4,5]

假如数组里嵌套数组和对象,浅拷贝只会拷贝该数组或许对象寄存在栈空间的地,因而不管在新旧数组中转变此地点指向的对象,两个数组都邑发作转变。 因而我们须要深拷贝来拷贝此类数组。

数组深拷贝
1.一般遍历,遍历到援用范例时刻举行援用范例的拷贝

let arr = [1,2,3,4,5,{name:'bob'},['a','b']]
      function clone (arr) {
        let arr1 = []
        arr.forEach(item=>{
        //假如不是object,将该值插进去到新数组
          if(typeof(item) !== 'object') {
            arr1.push(item)
          } else {
          //依据遍历的对象新建一个雷同范例的空对象
            let obj = item instanceof Array ? [] : {}
            for(var key in item){
              if(item.hasOwnProperty(key)){
                obj[key] = item[key]
              }
            }
            arr1.push(obj)
          }
        })
        return arr1
      }
      let arr1 = clone(arr)
      arr1[5].name = 'js'
      console.log(arr,'arr',arr1,'arr1')

2.简朴粗犷(能拷贝数组和对象,但不能拷贝函数)

let arr = [1,2,3,4,5,{name:'bob'},['a','b']]
let arr1 = JSON.parse(JSON.stringify(arr))
    原文作者:艾斯艾梦
    原文地址: https://segmentfault.com/a/1190000018577577
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞