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的实例:
结果3.png
怎么感觉自己既是自己的老子,又是自己儿子呢,哈哈,开玩笑。
当访问length属性时,Function与普通函数没有区别,都是访问自身的属性:
结果4.png
delete Function.length:
终于到正题了,上图:
结果5.png
看到结果,万千🐎奔腾而过啊,不是删除成功了,他喵的,怎么访问length属性还是访问到了呢,还变成了0。
细细想过,不对,此length可能非彼length了,有可能是Function.prototype上的,于是就开始验证:
结果6.png
果不其然,执行delete Function.length后,Function.length访问的其实是Function.prototype.length,待delete Function.prototype.length后,Function.length就访问不到了。











网友评论