Js中的引用类型、深拷贝、浅拷贝

问题:

最近工做中遇到一个问题,对现目录进行正序、倒序展现的操做,但真正的数据顺序不发生变化。
复制代码

首先,一块儿了解下Js的数据类型都有哪些?它们有哪些区别?

  • 基本类型:Number,String,Boolean,Null,undefined
  • 引用类型:Object,Array,Date,RegExp,Function

基本类型的变量是存储在栈内存中的,栈内存包括变量名和变量值;es6

引用类型的值同时存储在栈内存和堆内存中,栈内存中保存的是变量名和指向堆内存中对象的指针。形成这样的缘由是因为在Js中不容许直接操做对象的内存空间,只能操做对这个对象的引用;数组

基本类型的比较是值的比较,引用类型的比较是引用的比较函数

基本类型:spa

eg: let str1="ceshi";
let str2=str1;指针

由此可知: 基本类型的复制,其实是在栈内存中开辟了新的存储空间,来存储新的变量和值。一个的改变,不会影响另外一个的变化,两者互不干扰。code

引用类型:cdn

eg: let obj1=new Object(); let obj2=new Object();对象

由此可知: 引用类型的复制,实际上只是对引用的复制,二者的指针同时指向堆内存中的同一个对象。一个的改变,会影响另外一个的变化,二者互相影响。blog

深拷贝与浅拷贝

浅拷贝:就是拷贝一层,面对深层次的对象级别,就仅仅拷贝了其引用。 深拷贝:就是拷贝多层,即对每一层的数据都进行了拷贝,面对深层次对象级别,防止拷贝了其引用类型递归

浅拷贝:

方法一:拷贝对象有多层,直接遍历,则是浅拷贝

方法二:使用es6的Object.assign({},原对象);提示:(拷贝的对象有多层,此方法实现的是浅拷贝;拷贝的对象只有一层,此方法实现的是深拷贝)

深拷贝:

数组深拷贝:即防止拷贝到引用类型,防止彼此影响

方法一:es6 Array.from(要拷贝的数据)

方法二:es6 数组解构 ...

方法三:若拷贝的对象为一层,直接遍历,为深拷贝 方法四:使用JSON.stringify()、JSON.parse(),不足:若深层是函数,则实现不了深拷贝

方法五:使用递归思想

说到这里算是大体结束。我最后在项目中的解决方案:

因为个人目录数据是一层的,因此使用es6的方法,进行了深拷贝。这样当目录数据倒序时,我获取的接口数据并无发生顺序的变化

相关文章
相关标签/搜索