You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:16:34