最近工做中遇到一个问题,对现目录进行正序、倒序展现的操做,但真正的数据顺序不发生变化。
复制代码
基本类型的变量是存储在栈内存中的,栈内存包括变量名和变量值;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的方法,进行了深拷贝。这样当目录数据倒序时,我获取的接口数据并无发生顺序的变化