es6数组去重的方法(es6对象转数组)

面试时候有面试官问到ES6的解构赋值是深拷贝还是浅拷贝?,这里做一个总结.ES6的解构赋值,大家应该都清楚,就是可以快速取出数组或者对象中的值;我们先来看一个使用案例:解构赋值更多的解构赋值知识可以查

面试时候有面试官问到ES6的解构赋值是深拷贝还是浅拷贝?,这里做一个总结.

ES6的解构赋值,大家应该都清楚,就是可以快速取出数组或者对象中的值;我们先来看一个使用案例:es6数组去重的方法(es6对象转数组)

解构赋值

更多的解构赋值知识可以查看:

https://es6.ruanyifeng.com/#docs/destructuring

那么,ES6的解构赋值到底是深拷贝还是浅拷贝呢?

我们先来看一下深拷贝和浅拷贝的定义

深拷贝:修改新变量的值不会影响原有变量的值。默认情况下基本数据类型(number,string,null,undefined,boolean)都是深拷贝。

浅拷贝:修改新变量的值会影响原有的变量的值。默认情况下引用类型(object)都是浅拷贝。

我们先开看一个基本类型,直接用等号赋值的例子

let user = \'siri\'
let stu = user
stu = \'jack\'
console.log(\'输出:\',stu)
// 输出:jack
console.log(\'输出:\',user)
// 输出:siri

由上方的例子可以知道:
stu的数值改变并不会影响user ,所以基本数据类型,直接用等号赋值,也都是深拷贝;

我们再看一个引用类型,直接用等号赋值的例子

let obj1 = {
name:\'siri\',
age:18
}
let obj2 = obj1

obj2.name = \'jack\'
console.log(\'obj1\',obj1)
console.log(\'obj2\',obj2)
// obj1 {name: \"jack\", age: 18}
// obj2 {name: \"jack\", age: 18}

es6数组去重的方法(es6对象转数组)

上方例子中我们可以看到,obj1赋值给obj2,然后改变obj2中的name值,发现obj2中的name也跟随着改变了,所以是浅拷贝。(因为他们引用的是同一个地址的数据!拷贝的时候并没有给obj2创造独立的内存,只是把obj1指向数据的 指针 拷贝给了obj2)

上方的例子了解了之后 我们再回到解构赋值

修改最上方的解构赋值代码,给name 和 age赋值

const userInfo = {
name:\'siri\',
age:18
}
let {name,age} = userInfo
name = \'jack\'
age = 16
console.log(\'打印userInfo\',userInfo)
// 打印userInfo {name: \"siri\", age: 18}

我们发现userInfo 的数据并没有被改变,有同学会说,解构赋值好像是深拷贝啊?????es6数组去重的方法(es6对象转数组)

image.png

我们再修改一下代码看看

const userInfo = {
name:\'siri\',
age:18,
detail:{
qq:\'1\',
email:\'1366666@163.com\'
}
}
let {name,age,detail} = userInfo
name = \'jack\'
age = 16
detail.qq = \"2\"
console.log(\'打印userInfo\',userInfo)

打印信息:

es6数组去重的方法(es6对象转数组)

发现解构赋值出来的对象将原对象detail中的qq的数据修改了,这样看还是浅拷贝;

总结:

  • 解构赋值,如果所解构的原对象是一维数组或对象,其本质就是对基本数据类型进行等号赋值,那它就是深拷贝;
  • 如果是多维数组或对象,其本质就是对引用类型数据进项等号赋值,那它就是浅拷贝;

结论:解构赋值是浅拷贝(因为它确实不能对多维数组或对象达到深拷贝的作用);

深拷贝的实现方法

本质还是将对象拆开为基本数据类型进行赋值。

function deepClone(source){
const targetObj = source.constructor === Array ? [] : {}; // 判断复制的目标是数组还是对象
for(let keys in source){ // 遍历目标
if(source.hasOwnProperty(keys)){
if(source[keys] && typeof source[keys] === \'object\'){ // 如果值是对象,就递归一下
targetObj[keys] = source[keys].constructor === Array ? [] : {};
targetObj[keys] = deepClone(source[keys]);
}else{ // 如果不是,就直接赋值
targetObj[keys] = source[keys];
}
}
}
return targetObj;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/67328.html

(0)
nan
上一篇 2021-12-16
下一篇 2021-12-16

相关推荐

  • 傻狍子到底傻不傻(为什么说狍子傻)

    扯犊子、猫驴子、滚犊子、傻狍子被誉为东北的“四大神兽”,不过这四个说法之中,只有傻狍子是动物,不过对于“傻狍子”的这个说法,其实一点也不冤枉,因为傻狍子是真的“傻”,完全是颠覆你认知的傻。当然,虽然傻…

    2022-02-14 随笔
    0
  • 汤加为什么那么多中国人(汤加火山爆发有中国人伤亡吗)

    汤加为什么那么多中国人汤加王国是一个有10万人口太平洋小岛国,就是这样如中国一个小县大小的国家却有5、6千名中国人。岛上的中国人主要以开超市为主,即使是岛上最偏僻的穷乡僻壤也有中国人开的小超市,这些超

    2022-01-19
    0
  • 3个机箱风扇装什么位置(机箱风扇怎么装)

    苹果越狱后怎么还原(苹果手机越狱后怎么恢复)iPhone越狱后会有很多的意想不到的功能,但越狱使用时间久了就需要还原未越狱状态,无论是哪个越狱工具都有清理越狱环境的功能,但并不能全部清理干净还会有一些越狱残留,最有效的方法就是使用电脑下载固件进行刷机,但刷机只能更新为最新系统,显而易所以这次我们聊…

    2021-12-27
    0
  • seo增加外链技巧(seo发外链工具有哪些)

    seo外链工具怎么用?seo外链工具如何优化?外链对于SEO来说是一项很重要的工作,但是seo外链工具对于一些新手来说,可能有点陌生,下面我们来说说外链工具有用吗?seo外链工具是什么意思?(推荐阅读:SEO常用工具:站长会用的网站流量查询

    2021-11-30
    0
  • 58同城项目怎么玩(58同镇站长怎么盈利)

    姚劲波在2019世界互联网大会上主题分享钛媒体注:以往参加世界互联网大会,姚劲波都会带着新项目来乌镇露面。2017年参加媒体沟通会时,姚劲波带着的是58到家CEO陈小华、58速运联席CEO林凯源,转转…

    2021-12-02
    0
  • 银行存款vip客户(银行存款多少)

    我们国家的居民还是非常热爱存钱的,毕竟,手里有钱,做事不慌。对于银行来说,也是非常需要储户们的存钱,毕竟储户们进行存钱,可以为银行的发展提供最基础的保障。对于储户们来说,把钱存进银行,不仅可以获得一定的利息,还可以获得安心。对于这种双赢的局面,必然是…

    2022-01-15 随笔
    0

发表回复

登录后才能评论