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