Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Object.assign 的性能问题

  自从有了 Object.assign,对象浅拷贝我经常会用它来实现,至少写起来方便。但是 Object.assign 是直接把属性连特性一起复制过去的,也就是说它不会执行访问器属性,而是直接一并复制过来。然而在实际的业务中,我们需要复制的通常只是属性值而已,所以具体使用什么方式得视业务而定。
  其实 Object.assign 的实现本身并没有问题,如果我们手动调用 Object.keys,然后再逐个获取 getOwnPropertyDescriptor,最后使用 defineProperties 写回去的话,性能并不比 Object.assign 好。
  但一般的业务场景中我们并不需要这么暴力地复制一个对象,所以如果使用 Object.keys 取出要复制的部分再写回去的话性能比 Object.assign 好。
  下面是一段性能测试的代码:
<script src="https://share.web-tinker.com/performance.js"></script> <script> let a = { a: 1, b: 2, c: 3 }; let b = { d: 1, e: 2, f: 3 }; const test1 = function() { return Object.assign({}, a, b); }; const test2 = function() { let res = {}; let keysA = Object.keys(a); let keysB = Object.keys(b); let properties = {}; for (let i = 0; i < keysA.length; i++) { let key = keysA[i]; properties[key] = Object.getOwnPropertyDescriptor(a, key); } for (let i = 0; i < keysB.length; i++) { let key = keysB[i]; properties[key] = Object.getOwnPropertyDescriptor(b, key); } return Object.defineProperties({}, properties); }; const test3 = function() { let res = {}; let keysA = Object.keys(a); let keysB = Object.keys(b); for (let i = 0; i < keysA.length; i++) { res[keysA[i]] = a[keysA[i]]; } for (let i = 0; i < keysB.length; i++) { res[keysB[i]] = b[keysB[i]]; } return res; }; </script> <button>test1()</button> <button>test2()</button> <button>test3()</button>
网名:
34.203.245.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^