Open jiangjiu opened 7 years ago
最近看You-Dont-Know-JS看到es6第二章时,书上写到
另一些人可能喜欢用覆盖赋值的方式来完成这个任务。你可能会被ES6的Object.assign(..)工具(见第六章)所吸引,来首先克隆defaults中的属性然后使用从config中克隆的属性覆盖它,像这样:
config = Object.assign( {}, defaults, config );
这看起来好多了,是吧?但是这里有一个重大问题!Object.assign(..)是浅拷贝,这意味着当它拷贝defaults.options时,它仅仅拷贝这个对象的引用,而不是深度克隆这个对象的属性到一个config.options对象。Object.assign(..)需要在你的对象树的每一层中实施才能得到你期望的深度克隆。
立马试了一下,立马掉进了delete小坑中[捂脸] 过程如下:
var defaults = { options: { remove: true, enable: false, instance: {} }, log: { warn: true, error: true } }; var obj = Object.assign({},defaults); delete defaults.options; console.log(obj.options) // 一切都在
当时有点蒙蔽,为什么删掉了的属性没有影响obj.options? 不是浅拷贝嘛! 以为书写错了。。。看了眼MDN,瞬间打脸&&加深学习:
obj.options
跟一般人的认为的不一样的是,delete 操作符不会直接释放内存。其释放内存是通过打破引用间接完成的,可查看内存管理了解更多。 delete 操作符会从某个对象上移除指定属性。成功删除的时候回返回 true,否则返回 false。
跟一般人的认为的不一样的是,delete 操作符不会直接释放内存。其释放内存是通过打破引用间接完成的,可查看内存管理了解更多。
delete 操作符会从某个对象上移除指定属性。成功删除的时候回返回 true,否则返回 false。
果然,问题出在delete。而且MDN上还说了几种特殊情况:
var
window
let const
Non-configurable properties cannot be removed. This includes properties of built-in objects like Math, Array, Object and properties that are created as non-configurable with methods like Object.defineProperty().
MDN上关于delete操作符的讲解
就你不懂JS:es6与未来
Object.assign浅拷贝和delete小坑
最近看You-Dont-Know-JS看到es6第二章时,书上写到
立马试了一下,立马掉进了delete小坑中[捂脸] 过程如下:
当时有点蒙蔽,为什么删掉了的属性没有影响
obj.options
? 不是浅拷贝嘛! 以为书写错了。。。看了眼MDN,瞬间打脸&&加深学习:果然,问题出在delete。而且MDN上还说了几种特殊情况:
var
声明的全局对象没办法从window
上删除, 同时函数表达式/函数声明也没办法从全局上删除。let const
声明的变量则是可以从window
上删除的。Non-configurable properties cannot be removed. This includes properties of built-in objects like Math, Array, Object and properties that are created as non-configurable with methods like Object.defineProperty().
参考
MDN上关于delete操作符的讲解
就你不懂JS:es6与未来