我对JS很陌生,我试着理解我在几个地方读到的东西:
在尝试获取函数收到的参数数时,使用了Object.keys(arguments).length。然而,据我所知,这没有任何好处,更短的方法是只使用arguments.length
这是因为arguments拥有.length属性。(MDN参数对象)
有什么东西我遗漏了吗?在某些情况下,在性能或安全性方面首选使用object.keys()吗?
谢谢。
发布于 2021-07-07 10:27:54
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)
发布于 2021-07-07 09:48:43
如果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是绝对没有必要的。
发布于 2021-07-07 10:28:04
没有理由使用Object.keys(arguments).length来获取传递给函数的参数的计数。该值总是与arguments.length相同,因此充其量是多余的。
由于您有性能标记,我要补充的是,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, 2, undefined, 4);
test(1, 2, undefined, 4, ["a", "b", "c"]);
test({foo: "hello", bar: "world"});
test({foo: "hello", bar: "world"});.as-console-wrapper { max-height: 100% !important; }
https://stackoverflow.com/questions/68283649
复制相似问题