【问题标题】:Using object.keys(arguments).length VS arguments.length使用 object.keys(arguments).length VS arguments.length
【发布时间】:2021-09-17 20:36:58
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: javascript performance arguments javascript-objects


    【解决方案1】:

    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)

    【讨论】:

    • 感谢您的回答!你能指出我在哪里可以找到一些关于参数的“参数变量的不可见突变”和其他有问题的特征的数据吗?我找不到任何东西...另外,对于新代码,您建议使用什么来代替 arguments
    • 感谢您的更新。我接受了你的回答
    【解决方案2】:

    如果arguments 是一个对象,Object.keys(arguments).length 也可以工作:

    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

    【讨论】:

    • @VLAZ:假设我们谈论的是函数的arguments,而不是某人声明的某个变量。在这种情况下这是正确的,但仍然使解释有用。
    • 这并不意味着我不应该解释为什么 Object.keys 可以在那里使用......
    • 正如 VLAZ 所提到的,我的问题是指参数保留字(传递给函数的参数),正如我从文档中了解到的那样,它是一个类似数组的对象,所以它总是一个数组。 @VLAZ @Cerbrus - 我已将我的问题编辑为 Object。谢谢!所以...对于我的问题,是否有任何理由使用Object.keys()?抱歉,我无法将此标记为答案,因为我觉得它没有回答我的问题。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答和示例!我选择了georg 的答案,因为我觉得arguments 保留字更具体。我确实赞成你的回答,因为我相信它有重要的数据。谢谢
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 2020-04-02
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-02-09
    • 2017-11-19
    相关资源
    最近更新 更多