Object.defineProperty()与Object.defineProperties()的性能差异探究
Object.defineProperty() vs Object.defineProperties(): Why the Performance Gap?
嘿,你的测试结果完全合理——在Node.js v10.15.0环境下,多次调用Object.defineProperty()确实比单次调用Object.defineProperties()定义多个属性要快,从你给出的三次测试数据就能明显看出来:
执行三次的控制台结果:
1- prop: 9.251ms props: 17.034ms
2- prop: 10.050ms props: 22.443ms
3- prop: 11.013ms props: 17.086ms
先把你的测试代码贴出来方便参考:
var FOR_TIME = 10000; console.time("prop"); for(var i = 0; i < FOR_TIME; i++) { var test = {}; Object.defineProperty(test, "ba", {}); Object.defineProperty(test, "bab", {}); Object.defineProperty(test, "bac", {}); } console.timeEnd("prop"); console.time("props"); for(var i = 0; i < FOR_TIME; i++) { var test = {}; Object.defineProperties(test, { a: {}, ab: {}, ac: {} }) } console.timeEnd("props");
核心原因:defineProperties是封装的语法糖
其实Object.defineProperties()本质上就是一个批量调用Object.defineProperty()的语法糖。它的内部逻辑大概是这样的(简化版):
Object.defineProperties = function(obj, props) { for (var prop in props) { if (Object.prototype.hasOwnProperty.call(props, prop)) { Object.defineProperty(obj, prop, props[prop]); } } return obj; };
这就意味着使用defineProperties时,你会额外承担这些开销:
- 遍历传入的属性配置对象,做键值对的查找和遍历;
- 多了一层函数调用的栈开销——调用
defineProperties后,它内部还要发起多次defineProperty调用; - 额外的参数校验、边界处理(比如检查属性是否是自身属性),这些都是直接多次调用
defineProperty不会产生的成本。
要不要纠结这个差异?
得看场景:
- 只有在极端高频循环调用(像你测试里的1万次循环)的场景下,这个性能差距才会显现;
- 在日常业务开发中,两者的性能差几乎可以忽略,这时
defineProperties的可读性和简洁性反而更值得优先选择——毕竟写一个配置对象比多次调用方法要清爽得多。
内容的提问来源于stack exchange,提问作者buriedalive
相关产品推荐
相关产品推荐

