问题:
最近工作中遇到一个问题,对现目录进行正序、倒序展示的操作,但真正的数据顺序不发生变化。
首先,一起了解下Js的数据类型都有哪些?它们有哪些区别?
- 基本类型:Number,String,Boolean,Null,undefined
- 引用类型:Object,Array,Date,RegExp,Function
基本类型的变量是存储在栈内存中的,栈内存包括变量名和变量值;
引用类型的值同时存储在栈内存和堆内存中,栈内存中保存的是变量名和指向堆内存中对象的指针。造成这样的原因是由于在Js中不允许直接操作对象的内存空间,只能操作对这个对象的引用;
基本类型的比较是值的比较,引用类型的比较是引用的比较
基本类型:
eg: let str1="ceshi";
let str2=str1;

由此可知: 基本类型的复制,实际上是在栈内存中开辟了新的存储空间,来存储新的变量和值。一个的改变,不会影响另一个的变化,二者互不干扰。
引用类型: eg: let obj1=new Object(); let obj2=new Object();

由此可知: 引用类型的复制,实际上只是对引用的复制,两者的指针同时指向堆内存中的同一个对象。一个的改变,会影响另一个的变化,两者互相影响。
深拷贝与浅拷贝
浅拷贝:就是拷贝一层,面对深层次的对象级别,就仅仅拷贝了其引用。
深拷贝:就是拷贝多层,即对每一层的数据都进行了拷贝,面对深层次对象级别,防止拷贝了其引用类型
浅拷贝:
方法一:拷贝对象有多层,直接遍历,则是浅拷贝

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

数组深拷贝:即防止拷贝到引用类型,防止彼此影响
方法一:es6 Array.from(要拷贝的数据)

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

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

方法五:使用递归思想

说到这里算是大致结束。我最后在项目中的解决方案:
由于我的目录数据是一层的,所以使用es6的方法,进行了深拷贝。这样当目录数据倒序时,我获取的接口数据并没有发生顺序的变化

