大家好,今天来为大家解答propertydescriptor这个问题的一些问题点,包括PROPERTY也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
Object.assign是浅拷贝还是深拷贝
Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
Object.assign方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关getter和setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()和Object.defineProperty()。
String类型和Symbol类型的属性都会被拷贝。
在出现错误的情况下,例如,如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。
Object.assign不会在那些source对象值为或的时候抛出错误。
针对深拷贝,需要使用其他办法,因为Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string,number),通过Object.assign({},srcObj);得到的新对象为;如果属性值为对象或其它引用类型,那对于这个对象而言其实是的。
深拷贝的几种实现方法JSON.stringify和JSON.parse
用JSON.stringify把对象转换成字符串,再用JSON.parse把字符串转换成新的对象。
可以转成JSON格式的对象才能使用这种方法,如果对象中包含function或RegExp这些就不能用这种方法了。
Object.assign()拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
通过jQuery的extend方法实现深拷贝
let$=require('jquery');letobj1={a:1,b:{f:{g:1}},c:[1,2,3]};letobj2=$.extend(true,{},obj1);lodash.cloneDeep()实现深拷贝let_=require('lodash');letobj1={a:1,b:{f:{g:1}},c:[1,2,3]};letobj2=_.cloneDeep(obj1);使用递归的方式实现深拷贝function_deepClone(source){lettarget;if(typeofsource==='object'){target=Array.isArray(source)?[]:{}for(letkeyinsource){if(source.hasOwnProperty(key)){if(typeofsource[key]!=='object'){target[key]=source[key]}else{target[key]=_deepClone(source[key])}}}}else{target=source}returntarget}更多经典前端面试题,请到github查看或参与讨论
https://github.com/daily-interview/fe-interview
为什么undefined,NaN和Infinity可以被赋值,而null不可以
在javascript中
undefined、NaN和Infinity是全局对象window的属性。所以可以被赋值,但是由于它们的内部属性[[writable]]为false,所以赋值实际上无效。证明:
Object.getOwnPropertyDescriptor(window,'undefined');//结果://Object{value:undefined,writable:false,enumerable:false,configurable:false}
可见,undefined确实是window的属性,并且不可写。
null与true、false类似,是字面量,属于JavaScript的保留字。换句话说,跟123、'foobar'是一类的,当然不能赋值。
OK,本文到此结束,希望对大家有所帮助。