如何解决使用 object.keys(arguments).length VS arguments.length
我是 JS 新手,并试图理解我在几个地方读到的东西:
在尝试获取函数接收到的参数数量时,使用了
Object.keys(arguments).length
。但是,据我所知,这没有任何好处,更短的方法是使用 arguments.length
这是因为 arguments
拥有 .length
属性。
(MDN doc - The arguments object)
有什么我遗漏的吗?
在性能或安全方面,是否存在首选使用 object.keys()
的情况?
谢谢。
解决方法
arguments
是一个“奇异对象”,它是“类数组”——它具有数字属性和 .length
。使用 Object.keys
和 Object.keys(someArray)
一样有意义,即没有。
在新代码中最好完全避免使用 arguments
,因为它有一些阴暗的特性,比如参数变量的不可见突变。示例:
function someFunctionThatMutatesArray(a) {
a[0] = 'hey'
}
function func(xyz) {
someFunctionThatMutatesArray(arguments)
console.log(xyz) // surprise
}
func(100)
Node.js
如果 Object.keys(arguments).length
是一个对象也可以工作:
arguments
也就是说,如果已知输入值是一个数组(let arguments = ['foo','bar','baz'];
console.log('Array',Object.keys(arguments).length);
arguments = { 1: 'foo',2: 'bar',3: 'baz' }
console.log('Object',Object.keys(arguments).length);
是),则绝对没有必要使用 arguments
。
没有理由使用 Object.keys(arguments).length
来获取函数传入参数的数量。该值始终与 arguments.length
相同,因此充其量是多余的。
由于您有 performance 标签,我想补充说 Object.keys().length
可能会更慢。 然而,它也不太可能对整体产生太大影响。
function test() {
const keysLength = Object.keys(arguments).length;
const argsLength = arguments.length;
console.log( `keys: [${keysLength}] arguments: [${argsLength}] equal: [${keysLength === argsLength}]` );
}
test();
test(1);
test(1,2);
test(1,2,null);
test(1,undefined,4);
test(1,4,["a","b","c"]);
test({foo: "hello",bar: "world"});
test({foo: "hello",bar: "world"});
.as-console-wrapper { max-height: 100% !important; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。