为什么JavaScript参数有长度属性但其他对象没有?

时间:2017-04-06 14:25:56

标签: javascript object arguments

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

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

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

b
    {'0':'a','1':'b','2':'c'}
    b.length个
    3

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

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

someobj.length
     未定义

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

正如评论中所提到的,传递给函数的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