【问题标题】:why does JavaScript arguments have length property but other objects don't?为什么 JavaScript 参数有长度属性而其他对象没有?
【发布时间】:2023-04-05 17:10:01
【问题描述】:

为什么下面的代码有length属性(特别是通过向函数传递参数创建的对象):

function somefunction() {
  var a = arguments;
  return a;
}

var b = somefunction('a','b','c')

b
{ '0': 'a', '1': 'b', '2': 'c' }
b.长度
3

而如果创建了普通对象,则它没有length 属性:

var someobj = {
  '0': 'abc',
  '1': 'def',
  '2': 'efg'
}

someobj.length
未定义

【问题讨论】:

  • Arguments 是一个类似数组的对象,所以它有长度。一个普通的对象没有。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 所以 arguments 对象不是普通对象。
  • 如果一个普通对象有一个length,当你想将该属性用于其他目的时你会遇到问题。这不是索引集合的问题。
  • 这就是语言的工作方式。数组和类似数组的对象有一个“长度”属性,其中包含数字索引属性的数量。普通物体不会。要找出“为什么”,您需要阅读一些关于语言设计或其他内容的评论,这对您编写 JavaScript 代码没有多大帮助。
  • 让 arguments.length 可用才有意义,以便轻松知道通过了多少
  • 您使用的是什么浏览器/js环境(版本)?记录参数对象时,我得到了一个非常不同的输出。

标签: javascript object arguments


【解决方案1】:

var myObject = {a: "x", length: 5} 也有一个 .length 属性。 arguments.length 没有什么特别之处。好吧,也许它是non-enumerable,这就是它没有出现在你的console.log 中的原因,这可能会让你感到困惑。你也可以重现它:

var someobj = Object.defineProperty({
    '0': 'abc',
    '1': 'def',
    '2': 'efg',
    'length': 'whatever'
}, 'length', {enumerable:false});
console.log(someobj); // {0: "abc", 1: "def", 2: "efg"}
console.log(someobj.length); // whatever

【讨论】:

    【解决方案2】:

    如 cmets 中所述,传递给函数的 arguments 对象是一个类似数组的对象,它具有 arguments.length 方法,这是为了检索传递给函数的参数数量*。这与 Function.length 方法不同,后者指定函数预期的参数数量。

    function myFunc(param) {
            return arguments.length;
    }
    
    myFunc('param1', 'param2'); // 2
    
    myFunc.length; // 1
    

    * Javascript 语言的功能和动态特性允许将可变数量的参数传递给函数。为了有效地确定函数参数,我们使用 arguments 对象。

    为了检索对象的长度(它自己的属性),您可以使用Object.keys

    let myObj = {
         a: "one",
         b: "two"
    };
    
    Object.keys(myObj).length; // 2
    

    【讨论】:

      猜你喜欢
      • 2015-12-02
      • 1970-01-01
      • 2023-03-14
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多