资讯专栏INFORMATION COLUMN

js之数组克隆

xiaochao / 3174人阅读

摘要:主要分基本数据类型及引用数据类型两大类基本数据类型包括,新增引用数据类型等注意基本数据类型放在栈空间内,并且是按值存放,可以直接读取和操作。

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://www.ucloud.cn/yun/102695.html

相关文章

  • 前端一些需要掌握的简单知识点

    摘要:快速排序由在年提出。如果定时器的时间到了,那么也会去下一个阶段关闭的回调函数,一些准备关闭的函数等的事件轮询机制也可以看成是单线程,由上往下执行,但是到了第阶段,又会返回第一阶段,死循环。 原生javaScript是中大公司挑人的核心,也是决定你未来发展高度的核心。 冒泡排序,快速排序,深度克隆,深度冻结,数组操作,本章都有。 走遍大江南北,还是原生javaScript最美 感冒给大...

    n7then 评论0 收藏0
  • 前端一些需要掌握的简单知识点

    摘要:快速排序由在年提出。如果定时器的时间到了,那么也会去下一个阶段关闭的回调函数,一些准备关闭的函数等的事件轮询机制也可以看成是单线程,由上往下执行,但是到了第阶段,又会返回第一阶段,死循环。 原生javaScript是中大公司挑人的核心,也是决定你未来发展高度的核心。 冒泡排序,快速排序,深度克隆,深度冻结,数组操作,本章都有。 走遍大江南北,还是原生javaScript最美 感冒给大...

    liuhh 评论0 收藏0
  • 设计模式原型模式

    摘要:但是这种复制技术在的世界里早已出现,就是原型模式什么是原型模式用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象类图原型模式是设计模式中最简单的,没有之一。 前言 在现实世界中,我们通常会感觉到分身乏术。要是自己有分身那该多好啊,一个用来工作,一个用来看电视,一个用来玩游戏(无意中透露了自己单身狗的身份-。-),其实就是克隆,这种技术存在着很大的弊端,所以现在是禁止使用的。...

    jsyzchen 评论0 收藏0
  • ES6时代,你真的会克隆对象吗(二)

    摘要:多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。比如,表达式会返回,因为属性得到的仅仅是构造函数,而且是可以被手动更改的,只是返回的构造函数的名字,它并不返回类名。 原文:ES6时代,你真的会克隆对象吗(二) 上一篇,我们从Symbol和是否可枚举以及属性描述符的角度分析了ES6下怎么浅拷贝一个对象,发表在掘金和segmentfault上(...

    BoYang 评论0 收藏0

发表评论

0条评论

xiaochao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<