繁体   English   中英

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

[英]why does JavaScript arguments have length property but other objects don't?

为什么下面的代码具有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
未定义

var myObject = {a: "x", length: 5}也有.length属性。 arguments.length没有什么特别之处。 好吧,也许它是不可枚举的 ,这就是它没有出现在你的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

正如注释中所提到的,传递给函数的arguments对象是一个类似于Array的对象,它有一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM