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

use delete operator to delete .length in an empty function

本文关键字:length 函数 delete 运算符 删除 使用      更新时间:2023-10-18
function foo(){} 
delete foo.length; 
alert(typeof foo.length);

// result is number

为什么是上面的代码警报号码?这是一个错误吗?

-缺口

谢谢!

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

length 属性指定函数所需的参数数。它有property attributes Writable: false, Enumerable: false, Configurable: true.所以你不能删除它。它始终返回一个数字。

> 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++;

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

类型错误:无法将函数"函数 foo(a, b, c( {}" 的只读属性"长度"分配给只读属性

delete foo.length在严格模式下也有效,总是将foo.length更改为零。

delete foo.length不起作用,

因为长度仍然存在于函数原型中并且为 0。

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

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

现在您可以更改长度。

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

Object.setPrototypeOf(foo, {});

功能仍然可用。