ObjectObject属性可以简写吗?声明一个对象,key和value可以省略。上面的键必须是一个字符串。如果key需要添加一个动态变量(计算属性名)方法简写ES6可以添加一个异步函数。如何将一个对象复制到另一个对象?——source和target属性相同,target不是对象,如何使用Object.assign()?它解决了什么问题?有点瑕疵?对象扩展方法——ES6-ES10学习布局的Object属性可以简写Object.is()吗?声明一个对象,key和value可以省略//ES5声明一个变量letx=1lety=3letobj={x:x,y:y}//ES6letobj={x,y}上面的key必须是a字符串,如果给key添加动态变量(计算属性名)//ES5letx=1lety=3letobj={x:x}obj[y]=5console.log(obj)//{3:5,x:1}//ES6letx=1lety=3letz=2letobj={x:x[y]:6,[z+y]:8}console.log(obj)//{3:6,x:1,5:8}方法简写//ES5letobj={x:1,hello:function(){console.log('hello')}}//ES6letobj={x:1,hello(){//简写console.log('hello')}}obj.hello()ES6可以添加异步函数letobj={x:1,*hello(){//等同于function*functionName(){}console.log('hello')}}obj.hello()//(输出为空)如何将一个对象复制到另一个对象中?——Object.assign()Object.assign(target,...sources)
target是目标对象是必需的
sources是源对象不是必需的
该方法作用于一个或多个源的所有可枚举属性的值复制对象到目标对象,会返回目标对象(浅拷贝)
如果源和目标有相同的属性,如果源对象为0,则直接返回目标对象,如果对象有相同的属性,那么源对象的属性会覆盖目标对象中的属性constsource1={a:123,b:123}consttarget={a:456,c:456}constresult=Object.assign(target,source1)console.log(target)//{a:123,c:456,b:123}console.log(target===result)//如果目标不是对象,则为真如果目标不是对象,它会自动转换为对象lett=Object.assign(2)//Number{2}lets=Object.assign(2,{a:2})//Number{2,a:2}的使用方法?如何将以下源对象复制到目标对象?consttarget={}constsource={b:4,c:5}//ES5遍历source,将里面的数据一一复制到target//虽然原理简单,但实际操作起来还是挺麻烦的//ES6Object.assign(target,source)console.log(source,'source')解决什么问题?复制后,如果要修改里面name的值,外界也会修改functionfunc(obj){obj.name='funcobj'console.log(obj)//{name:'funcobj'}}constobj={name:'globalobj'}func(obj)console.log(obj)//{name:'funcobj'}避免这种情况,使用assign复制到一个新对象上面的函数func(obj){constfuncObj=Object.assign({},obj)funcObj.name='funcobj'console.log(funcObj)//{name:'funcobj'}}constobj={name:'globalobj'}func(obj)console.log(obj)//{name:'globalobj'}有点缺陷?上面的方法有缺陷:
赋引用类型的值时,不管里面的值是什么,直接替换地址consttarget={a:{b:{c:{d:4}}},e:5,f:6,h:10}constsource={a:{b:{c:{d:1}}},e:2,f:3}Object.assign(target,source)console.log(目标)/*{a:{b:{c:{d:1}}},e:2,f:3}*///如果目标是空对象或者源对象的严格格式被替换成I感觉没什么问题,但是从上面的公式可以看出Object.assign进行的是浅拷贝。复制引用类型时,地址会被整体替换,所以h没有保留。解决方案——>Object.assign+递归对象扩展方法——Object.is()在ES5之前,我们使用==和===来判断两个变量是否相等。两个等号运算时,会先转换数据类型,所以会出现0==false为真的情况,三等号除了比较值外,还会比较类型。但是后面的三个等号,也会有一些情况,使用is方法可以得到正确的结果。但是,一般建议使用三个等号。console.log(-0===+0)//trueconsole.log(Object.is(-0,+0))//falseconsole.log(NaN===NaN)//falseconsole.log(Object.is(NaN,NaN))//真正的学习布局
