使用delete运算符删除空函数中的.length

时间:2013-11-26 04:05:47

标签: javascript

function foo(){} 
delete foo.length; 
alert(typeof foo.length);


// result is number

为什么以上代码提醒号码?这是一个错误吗?

-Nick

谢谢!

4 个答案:

答案 0 :(得分:1)

一个函数对象有一个名为.length的内置属性,它指定使用该函数定义的参数数量,这是您无法删除或更改其值的函数。

答案 1 :(得分:1)

length属性指定函数预期的参数数量。它有property attributes Writable: false, Enumerable: false, Configurable: true。所以你不能删除它。它总是返回一个数字。

答案 2 :(得分:0)

2018年更新

实际上,它比你的例子所展示的更奇怪

使用此代码似乎foo.length无法更改:

function foo() {}
alert(foo.length);        // alerts 0
delete foo.length; 
alert(typeof foo.length); // alerts 'number'
alert(foo.length);        // alerts 0

但这更有趣:

function foo(a, b, c) {}
alert(foo.length);        // alerts 3
delete foo.length; 
alert(typeof foo.length); // alerts 'number'
alert(foo.length);        // alerts 0

所以不是你的delete foo.length没有改变它的价值 - 它确实如此,但它将它改为0!

值得注意的是,这对非严格模式没有影响:

foo.length = 0;
foo.length++;

但是上述两行都会在严格模式下引发异常:

  

TypeError:无法分配给函数'function foo(a,b,c)的只读属性'length'{}'

delete foo.length也适用于严格模式,始终将foo.length更改为零。

答案 3 :(得分:0)

delete foo.length不起作用,因为函数原型中仍然存在长度,并且长度为0。

要更改函数的长度或名称,可以将其重新定义为可写的。

Object.defineProperty(foo, 'length', { writable: true, configurable: true });

现在您可以更改长度。

请记住,如果删除长度,则函数原型中的长度仍然为0。 您可以根据需要进行更改:

Object.setPrototypeOf(foo, {});

该功能仍然可用。