JS获取函数参数数量用Object.keys(arguments).length还是arguments.length
关于JS中
arguments.length和Object.keys(arguments).length的差异说明 核心结论
绝大多数场景下直接使用arguments.length获取函数实参数量是更规范、性能更优、结果更准确的选择,使用Object.keys(arguments).length属于多余写法,甚至会引入非预期问题,没有任何性能或安全性层面的理由推荐后者。
具体差异说明
- 原生设计定位区别
arguments是函数执行时自动生成的类数组内置对象,其自带的length属性是ECMAScript标准明确规定的、专门用于返回当前函数接收的实参总个数的属性,不需要额外遍历计算,性能开销极低。
而Object.keys(arguments).length需要先遍历arguments对象所有可枚举的自有属性、生成键名数组后再取长度,执行开销远高于直接读原生属性。 - 结果一致性的坑点
Object.keys会统计所有可枚举的自有属性,只要出现以下两种非常规操作,得到的结果就不是真实的实参数量:- 人为给
arguments添加非数字索引的自定义属性(比如arguments.customTag = 'test'),这类自定义属性会被计入Object.keys的长度统计,而arguments.length不会受影响 - 人为删除
arguments的某个索引属性(比如delete arguments[1]),被删除的索引不会被计入Object.keys的长度统计,但arguments.length不会跟随修改,仍然返回原始实参数量
- 人为给
补充注意事项
箭头函数内部不存在独立的arguments对象,两种写法都无法生效,如需获取箭头函数的参数列表,推荐使用剩余参数语法const fn = (...args) => { console.log(args.length) }。
内容的提问来源于stack exchange,提问作者Oron Werner
相关产品推荐
相关产品推荐

