Function、Array 和 Object 构造函数的长度属性是啥?

Posted

技术标签:

【中文标题】Function、Array 和 Object 构造函数的长度属性是啥?【英文标题】:What is the length property of the Function, Array, and Object constructors?Function、Array 和 Object 构造函数的长度属性是什么? 【发布时间】:2012-12-12 14:37:04 【问题描述】:

什么是函数、数组和对象构造函数的长度静态属性?

静态方法是有意义的,但是长度静态属性呢?

Object.getOwnPropertyNames(Array)
["length", "name", "arguments", "caller", "prototype", "isArray"]

Object.getOwnPropertyNames(Function)
["length", "name", "arguments", "caller", "prototype"]

注意:我得到了关于 Function.prototype 的长度属性的答案,这里没有询问。

Object.getOwnPropertyNames(Function.prototype)
["length", "name", "arguments", "caller", "constructor", "bind", "toString", "call", "apply"]

Object.getOwnPropertyNames(Object)
["length", "name", "arguments", "caller", "prototype", "keys", "create", "defineProperty", "defineProperties", "freeze", "getPrototypeOf", "getOwnPropertyDescriptor", "getOwnPropertyNames", "is", "isExtensible", "isFrozen", "isSealed", "preventExtensions", "seal"]

【问题讨论】:

ECMA-262 第 3 版,第 15.2.315.3.315.4.3 部分指定所有这些构造函数有一个length 属性,其值为1。 感谢您的澄清 :) 但为什么 1 有任何具体原因? 【参考方案1】:

ArrayFunctionObject 都是构造函数,所以它们都是函数。函数的length 属性指定函数采用的(命名)参数的数量。来自 ECMA-262 第 3 版,第 15 节:

本节中描述的每个内置函数对象——无论是作为构造函数,还是 普通函数,或两者兼有——具有长度属性,其值为整数。除非另有规定, 此值等于函数描述部分标题中显示的命名参数的最大数量,包括可选参数。

正如 DCoder 指出的那样:

ECMA-262 第 3 版,第 15.2.3、15.3.3 和 15.4.3 节指定所有这些构造函数都有一个长度属性,其值为 1。

关于静态字段的观点:javascript 中没有静态字段之类的东西,因为 JavaScript 中没有类。只有原始值、对象和函数。对象和函数(也可以作为对象)具有属性

可能令人困惑的一件事是Function 实际上是一个函数。一个鲜为人知的事实是,您可以使用此构造函数创建函数。例如:

var identity = new Function("a", "b", "return a")
console.log(identity(42))

上面将打印42。现在注意两件事:Function 实际上接受参数并用它们做一些事情;我向Function 构造函数传递了多个参数,即使Function.length 等于1。结果 identity 也是一个函数,其 length 属性设置为值 2,因为它是一个有两个参数的函数。

【讨论】:

我对 Function 类的静态长度感兴趣,而不是对单个实例或函数对象的长度属性感兴趣。您说的是 Function.prototype 而不是 Function。 Object.getOwnPropertyNames(Function.prototype) 还返回不同的长度属性。 我向你保证,我们说的是同一件事。 Function.length 等于 1 因为 Function 是一个函数(这是令人困惑的部分),它有一个命名参数。请注意,Function 可识别多个参数,但在内部实现中仅命名了一个。 构造函数的任何属性都被所有函数对象共享。我错了吗? 这是不正确的。构造函数内的代码将为对象分配属性,new 关键字会将__proto__ 属性分配给Constructor.prototype,这也将用于属性查找。构造函数的属性与其实例之间没有关系。 f = new Function("x","y","re​​turn x+y;"); f.length 为 2,但它特定于变量 f 或此函数。在整个函数类上定义的静态东西呢?【参考方案2】:

上面提到的都是函数,它有一个属性长度,表示函数接受的参数数量。这就是为什么它们在这里将长度作为静态变量。

fun = function( a)  alert(a); 
//fun.length = 1

【讨论】:

这个length属性是Function.prototype继承的,不是Function。

以上是关于Function、Array 和 Object 构造函数的长度属性是啥?的主要内容,如果未能解决你的问题,请参考以下文章

props with type object/array must use a factory function to return the default value

props with type object/array must use a factory function to return the default value

typeof 返回的数据类型

Object类型与Array类型

vue中报错Props with type Object/Array must use a factory function to return the default value

VUE props的坑(Props with type Object/Array must use a factory function to return the default value)(代码