使用 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.keysObject.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 相同,因此充其量是多余的。

由于您有 标签,我想补充说 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; }