再看Object.assign

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43307658/article/details/87793295

欢迎访问我的博客https://qqqww.com/,祝码农同胞们早日走上人生巅峰,迎娶白富美~~~

1 前言

这是今天面试的一个问题,问题是:Object.assign是深拷贝还是浅拷贝,因为之前专门就JS的深拷贝和浅拷贝做过研究,也写了文档记录,自认为自己高的还是比较清楚的,所以我就很自信的答了,说是浅拷贝,坐车上仔细想了想,将面试问题总结了一下,至于面试问题的总结以后都会在博客体现,回归正题:这里说说我去MDN和各种博客看到的内容,结果令我尴尬了哈哈哈,那么Object.assign到底是浅拷贝还是深拷贝呢?那就得再来看看到底什么是浅拷贝,什么是深拷贝?

2 什么是浅拷贝

浅拷贝是内存地址的复制,是让目标对象指针和源对象指向同一片内存空间,那么相当于什么呢?下面举个例子

var people = {
    name: 'zhangsan',
    age: 10
}
var people2 = people
console.log(people.age) // 10
console.log(people2.age) // 10
people2.age = 100
console.log(people.age) // 100
console.log(people2.age) // 100
// people 的值被修改了

看上面代码。将people直接赋值给people2,此时修改people2.agepeople.age也会跟着变化,即他们实际上是引用的赋值,指向的是同一个内存空间,所以修改了people2.age相当于修改的是指向的这块共同的内存空间中的age所以说,people.age会跟着变化这叫浅拷贝

3 什么是深拷贝

先看个例子

var people = {
    name: 'zhangsan',
    age: 10
}
var people2 = {
    name: people.name,
	age: people.age
}
var people2 = people
console.log(people.age) // 10
console.log(people2.age) // 10
people2.age = 100
console.log(people.age) // 10
console.log(people2.age) // 100
// people 的值没有被修改

看以上代码,这次拷贝通过将people下面的属性赋值给people2下面的属性,并且当people2.age被修改的时候,people.age没有被修改这叫做深拷贝

4 看看Object.assign

引用MDN中的一句话:Object.assign()将所有可枚举的值从一个或者多个源对象复制到目标对象,它将返回目标对象

举两个例子说明:

当Object.assign()去处理一层拷贝时

var people = {
    name: 'zhangsan',
    age: 10
}
var people2 = Object.assign({}, people)
console.log(people.age) // 10
console.log(people2.age) // 10
people2.age = 100
console.log(people.age) // 10
console.log(people2.age) // 100
// people 的值没有被修改

这个时候我们看到,people.age的值不受people2.age的影响,说明是深拷贝

当Object.assign()去处理多层拷贝时

var people = {
    name: 'zhangsan',
    age: 10,
    zhangsan: {
        say: function () {
            console.log('hello')
        },
        height: 180
    }
}
var people2 = Object.assign({}, people)
console.log(people.zhangsan.height) // 180
console.log(people2.zhangsan.height) // 180
people2.zhangsan.height = 181
console.log(people.zhangsan.height) // 181
console.log(people2.zhangsan.height) // 181
// people 的值被修改了

我们发现people.age的值受到了people2.age的影响,所以在此处是浅拷贝

5 总结

由以上例子看到,Object.assign()实际上只在在第一层是深拷贝,第一层以下的全是浅拷贝

当时没搞清楚的问题,不光要记录,还要多回顾啊

6 参考文章

展开阅读全文

再看IT

02-13

2002对于这个IT行业来说,太冷了,不知道2003会是什么样子,外面的就业形势是在不好,而对于我们这些拿着不高不低工资的人来说,每日也是担惊受怕、如履薄冰。rn我自认为是一个比较纯粹的技术人员,不是为了混口饭吃进入IT行业的,因为我热爱技术,喜欢享受解决问题带来的快感,但是我太单纯了,中国的IT行业也太幼稚了!rnrn  我在上海,上海本身就是一个以经济利益为中心的城市,当唯利是图和IT结合在一起的时候,就更可怕了,2001年,我进入了一个公司,看上去这还算一个不小的公司,我做开发工程师,用Linux和PHP+Mysql,技术上没有什么大的问题,但是老板却要在1个月的时间里做出一个OA产品,简直是天方夜谭,但是没办法,硬着也要上啊,也不只到是从哪里找来的一个国内还比较有名的OA产品,拿过来改造重写,原来这个产品是ASP+SQL Server的,我们要把它改为PHP+MYSQL,MYSQL的功能实在有限,视图、存储过程都没有,我只有用PHP程序的方式来解决,真的很费劲,我们从3月低到4月低,用了一个月的时间,每天加班,还真的做出了这个东西,当然可想而知起质量如何,没办法阿,老板要推,还是往政府里推,说实话我都胆寒,这东西能用在政府里,中国政府也TMD快完蛋了。后来为了报知识产权,我们补设计文档、数据库说明。再后来的所有时间,我们都是在不停的修补BUG,往上打补丁,代码混乱,做过的东西我都不想再看。更气人的是,由于是和政府打交道,我每天要往政府里跑,说实话我真的不想去,我本身是做技术的,让我直接接触客户,总不大适应,但是技术人员接触一下市场也是有好处的,就硬着头皮去,但是这帮政府的垃圾根本不把你当人,什么难听的话都能说得出,什么让你难堪的事情也做得出来,而且背地里还要给他们送钱,他们还要凭这个办公自动化捞政绩!rnrn  其实我2000年底就开始研究JAVA,我很想把这个OA产品研究透彻,然后重新用J2EE开发一套OA,对于公司肯定有很大的好处,但是这个想法是不会被实现的,因为在老板看来,最快的赚到钱才是最重要的,我真的很失望,中国的IT行业就这样,将被自己的眼前利益和短期行为葬送!rnrn  我们总在背后骂老板的坏话,老板固然坏,但总有其中的原因,设身处地,如果自己作为一个老板,而又在中国这样的IT环境中,你会是什么选择。中国的IT公司太不规范,或者说从来没有规范。IT公司基本上有两种运作模式,一种是以产品为导向,另一种是以项目为导向,但是现在做项目的越来越多,做产品的越来越少,因为项目能够很快的得到收入,而产品却有很大的不确定性,一个产品的成熟期是5年,一个老板不会有5年的耐心来做一个市场可能并不十分明确的产品,那么不做产品做项目,做项目的竞争其实就是关系的竞争,谁的关系硬说就能拿到订单,金钱、香车、美女,能用上的全都用上了,在这个时候中国的IT行业已经与技术人员心中的理想背离的太远了!rnrn  想到这里,不能不说说人力资源、职业发展,我们总能听到企业的老总们说我们要尊重人才,现在社会的竞争就是人才的竞争,但是有多少企业真正尊重过人才,老板们说得最多的话就是:“你不想干可以走,这里缺了谁都可以,反正现在外面要找工作人多的是!”,这样的话,每一个人听了都会心寒,其实老板并不清楚,这样的做法带来的是更高的成本和失败的可能性,软件开发没有文档,核心技术可能会被一两个人掌握,新的人员需要很长的时间才能看懂代码,而核心人员的离开,将是致命的打击。rnrn  2003有是新的一年,我早已离开原来这家做OA的公司,但是走出虎穴又入狼窝,面对无序混乱的开发,面对利益当头的市场,面对浮躁的整个行业,我不能再说什么。我只有这样的想法,能够找到几个能把眼前利益稍微看的淡一些的合作者,平心静气,潜心研究,发掘出自己的核心技术和核心竞争力,这样才不愧对我心! 论坛

再看 再看 看看哪里错了

09-02

这是一个公安部提供的 drv_interface.write_km2(string lsh,string sfzmhm,string kscx,datetime ksrq,integer kscj,integer kscs,string ksy1,string ksy2,string jbr,string zt,string sn,integer res,string err) rnlsh 流水号\ sfzmhm 身份证\kscx 考试车型\ksrq 考试日期\kscj 考试成绩\kscs考试次数\ksy1监考员1\ksy2 监考员2\jbr 经办人\zt 考试结果 \sn 考试认证码 \res 返回值 \err错误描述rnrnpublic struct UpdataStruct rn rn public string arg_Lsh;//流水号 rn public string SFZHM;//身份证 rn public string KSCX;//考试车型 rn public DateTime arg_Ksrq;//考试日期 rn public int arg_Kscj;// 考试成绩 rn public int arg_Kscs;// 考试次数 rn public string arg_Ksy1;// 考试员 rn public string arg_Ksy2;// 考试员 rn public string Zt;//考试状态 rn public string arg_Sn;// 序列号,与原接口序列号一致 rn public int arg_Res;// 返回结果 rn public string arg_Err;// 错误描述 rn rn rnrnOracleParameter[] parameters = new OracleParameter("lsh",OracleType.VarChar,11), rn new OracleParameter("sfzmhm",OracleType.VarChar,18), rn new OracleParameter("kscx",OracleType.VarChar,2), rn new OracleParameter("ksrq",OracleType.DateTime,8), rn new OracleParameter("kscj",OracleType.Int16,3), rn new OracleParameter("kscs",OracleType.Int16,2), rn new OracleParameter("ksy1",OracleType.VarChar,30), rn new OracleParameter("ksy2",OracleType.VarChar,30), rn new OracleParameter("jbr",OracleType.VarChar,30), rn new OracleParameter("zt",OracleType.VarChar,1), rn new OracleParameter("sn",OracleType.VarChar,32), rn new OracleParameter("res",OracleType.Int16,1), rn new OracleParameter("err",OracleType.VarChar,50); rn parameters[0].Value = UpdataS.arg_Lsh; rn parameters[1].Value = UpdataS.SFZHM; rn parameters[2].Value = UpdataS.KSCX; rn parameters[3].Value = UpdataS.arg_Ksrq; rn parameters[4].Value = UpdataS.arg_Kscj; rn parameters[5].Value = UpdataS.arg_Kscs; rn parameters[6].Value = UpdataS.arg_Ksy1; rn parameters[7].Value = UpdataS.arg_Ksy2; rn parameters[8].Value = "王青博"; rn parameters[9].Value = UpdataS.Zt; rn parameters[10].Value = UpdataS.arg_Sn; rnrn parameters[0].Direction = ParameterDirection.Input; rn parameters[1].Direction = ParameterDirection.Input; rn parameters[2].Direction = ParameterDirection.Input; rn parameters[3].Direction = ParameterDirection.Input; rn parameters[4].Direction = ParameterDirection.Input; rn parameters[5].Direction = ParameterDirection.Input; rn parameters[6].Direction = ParameterDirection.Input; rn parameters[7].Direction = ParameterDirection.Input; rn parameters[8].Direction = ParameterDirection.Input; rn parameters[9].Direction = ParameterDirection.Input; rn parameters[10].Direction = ParameterDirection.Input; rn parameters[11].Direction = ParameterDirection.Output; rn parameters[12].Direction = ParameterDirection.Output; rn string slq = "DRV_ADMIN.DRV_INTERFACE.WRITE_KM2"; rn Oracle_DataBC.CreateQueryCommand(slq, parameters); rnrnrn public void CreateQueryCommand(string procName, OracleParameter[] prams) rn rn OracleCommand cmd; rn Open(); rn try rn rn cmd = new OracleCommand(procName, orl_con); rn cmd.CommandType = CommandType.StoredProcedure; rnrn foreach (OracleParameter parameter in prams) rn rn cmd.Parameters.Add(parameter); rn rn cmd.ExecuteNonQuery(); rn rn catch (Exception e) rn rn throw (e); rn rn finally rn rn this.Close(); rn rnrn rn错误信息 rn09051576086*370303199003043517*C1*2009-8-15 10:44:40*80*1*唐丽霞*武斌*1 rnSystem.Data.OracleClient.OracleException: ORA-06550: line 1, column 7: rnPLS-00306: wrong number or types of arguments in call to 'WRITE_KM2' rnORA-06550: line 1, column 7: rnPL/SQL: Statement ignored rnrn at DataDao.DataBaseClass.CreateQueryCommand(String procName, OracleParameter[]& prams) rn at DataDao.UpdateData.UpOracleData(UpdataStruct UpdataS, String& errorTxt) 论坛

没有更多推荐了,返回首页