为什么函数有一个length属性?

3

我一直在调试这段代码(链接)。不知道为什么,一个函数被检测为抽象数组,因为它有一个长度属性。虽然长度为0,但这个问题还是很奇怪的。

var test_set = [null,
                undefined,
                NaN,
                true,
                false,
                1,
                'a',
                {test:'test'},
                [0], 
                function(){}, 
                /test/
               ];

var index, 
    key,
    test;

function isArrayAbstract (obj) {
    return (obj != null) && (obj.length === +obj.length);
};

for(index = 0; index < test_set.length; index++){
    test = isArrayAbstract(test_set[index]);
    console.log('Mark | ' + test_set[index]);
    console.log(test);
}

1
你是在问它为什么存在还是它是什么?其中一个很容易回答。 - Felix Kling
可能是什么是Function,Array和Object构造函数的长度属性?的重复。 - OzrenTkalcecKrznaric
4个回答

4

Function.length

length 是一个函数对象的属性,表示该函数期望接收的参数数量,即形式参数的数量。相比之下,arguments.length 局限于函数内部,提供实际传递给函数的参数数目。

参见以下示例:

console.log( (function () {}).length );  /* 0 */
console.log( (function (a) {}).length ); /* 1 */
console.log( (function (a, b) {}).length ); /* 2 etc. */
console.log( (function (...args) {}).length ); /* 0, rest parameter is not counted */

请参考ECMAScript语言规范
在本条款中描述的每个内置函数对象(无论是构造函数、普通函数还是两者兼备)都有一个长度属性,其值为整数。除非另有规定,否则该值等于函数说明的子条款标题中显示的最大命名参数数量,包括可选参数。

3

length属性指定函数期望的参数数量。

来自MDN

length是一个函数对象的属性,表示函数期望的参数个数,即形式参数的数量。

(function(){}).length;  // 0
(function(a){}).length; // 1

@pure_code.mom:虽然函数有一个.length属性,但它们没有数字属性。它与数组或类似数组对象的.length属性不可比较,具有不同的含义。 - Felix Kling
@pure_code.mom 这就是arguments对象的用途。 - lonesomeday

1
实际上,函数中的 length 字段是有目的的。来自Function.length 的 MDN 文档的解释如下:

指定函数所期望的参数数量。


1

函数的length属性是定义它接收的参数数量。例如

function foo(a,b){
...
}

在这种情况下,foo.length将是2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接