使用 object.keys(arguments).length VS arguments.length

Using object.keys(arguments).length VS arguments.length

我是 JS 的新手,我试图理解我在几个地方读到的东西:

在尝试获取函数接收到的参数数量时,使用了 Object.keys(arguments).length。但是,据我所知,这没有任何好处,更短的方法是只使用 arguments.length

这是因为 arguments 持有 .length 属性。 (MDN doc - The arguments object)

有什么我想念的吗? 在性能或安全方面,是否存在优先使用 object.keys() 的情况?

谢谢。

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。使用 Object.keysObject.keys(someArray) 一样有意义,即 none.

在新代码中,最好完全避免 arguments,因为它的阴暗特征,比如参数变量的不可见突变。示例:

function someFunctionThatMutatesArray(a) {
    a[0] = 'hey'
}

function func(xyz) {
    someFunctionThatMutatesArray(arguments)
    console.log(xyz) // surprise
}

func(100)

没有理由使用 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; }