由delete Function.length引发的一些思考
delete:
在JS中,delete
操作符用来删除一个对象的属性,其基本用法为:
delete object.property
delete object["property"]
在严格模式中,如果属性是一个不可配置(non-configurable)属性,删除时会抛出异常,非严格模式下返回false
,其他情况都返回true
。
可以使用delete
操作符来删除一个隐式声明的全局变量,也就是没有使用var
声明的全局变量。全局变量其实是global对象(window)的属性。但是对于使用var
声明的变量,则无法通过delete
删除。
var a=1;
b=2;
delete window.a;
delete window.b;
console.log(window.a);
console.log(window.b);
运行结果如下:
结果1.png对于var
声明的全局变量a
,并没有删除成功,而隐式声明的全局变量b
,删除成功了。通过查看window
的属性a
和b
的属性描述符:
var a=1;
b=2;
console.log(Object.getOwnPropertyDescriptor(window,"a"));
console.log(Object.getOwnPropertyDescriptor(window,"b"));
结果如下:
结果2.png可以看到,通过var
声明的全局变量a
,其属性描述configurable
为false
,表明其不可通过delete
操作符删除。而未通过var
声明的全局变量b
,其属性描述configurable
为true
,表明其可以通过delete
操作符删除。
至于,为什么通过var
声明和未通过var
声明的全局变量的属性描述configurable
会有这样的差异,目前不得而知,可能是JS规范中的要求,还请知道的小伙伴告知。
Function.length:
函数的length
属性表示的是函数的形参个数,不包括 剩余参数,当形参中存在默认值时,只包括第一个有默认值的形参的前面的参数。
为什么此处说函数的length
属性,而没有说Function
的length
属性呢😝。因为Function
构造函数也是函数,因此,Function
也是Function
的实例:
怎么感觉自己既是自己的老子,又是自己儿子呢,哈哈,开玩笑。
当访问length
属性时,Function
与普通函数没有区别,都是访问自身的属性:
delete Function.length:
终于到正题了,上图:
结果5.png看到结果,万千🐎奔腾而过啊,不是删除成功了,他喵的,怎么访问length
属性还是访问到了呢,还变成了0
。
细细想过,不对,此length
可能非彼length
了,有可能是Function.prototype
上的,于是就开始验证:
果不其然,执行delete Function.length
后,Function.length
访问的其实是Function.prototype.length
,待delete Function.prototype.length
后,Function.length
就访问不到了。