js的内部特性和删除操作符的引入
a = 1;
console.log(窗口。一个); / / 1
Console.log (delete window.a); / / true
console.log(窗口。一个); / /未定义
var b=2;
console.log(窗口。B); / / 2
console.log(删除窗口。B); / /假
console.log(窗口。B); / / 2
从上面的问题你可以看出两者之间的区别:不要使用var语句变量,使用删除关键字可以被删除,它再次得到未定义;在一个变量中用var声明,使用删除是不删除的,然后得到它仍然是2。
1。删除操作员
当使用删除删除变量或属性时,删除成功地返回为true,否则返回false。
除了上述两种情况之外,还有许多其他常见的变量可以通过删除删除,不能删除。当我们不关心删除变量时,为什么要产生这样的结果,这里只看他的返回值:
删除删除数组中的一个元素:
对~的使用不是为了循环,忽略元素。
对于()的使用可以获得元素,但是值是未定义的。
var arr = { 1, 2, 3,4 };
console.log(ARR); / / { 1, 2, 3,4 }
console.log(删除ARR { 2 }); / /真实,删除成功
console.log(ARR); / / { 1, 2,4 },
删除函数类型的变量:
不能删除Chrome浏览器;Firefox可以被删除。
函数(){
}
console.log(功能);
console.log(删除功能);
console.log(功能);
删除function.length,这是获得的参数,参数的个数:
func1函数(A,B){
}
console.log(func1。长度); / / 2
console.log(删除func1。长度); / /真实,删除成功
console.log(func1。长度); / / 0
删除公共变量:
console.log(删除南); / /假,删除失败
console.log(删除未定义); / /假
console.log(删除无限); / /假
console.log(删除无效); / /真实,删除成功
删除原型,而不是删除原型上的属性:
功能人(){
}
person.prototype.name =蚊子;
console.log(删除的人。原型); / /错误,无法删除
console.log(删除对象。原型); / /假
当数组和字符串的长度被删除时:
var arr = { 1, 2, 3,4 };
console.log(arr.length); / / 4
console.log(删除arr.length); / /假,删除失败
console.log(arr.length); / / 4
var str = 'abcdefg;
console.log(str.length); / / 7
console.log(删除str.length); / /假,删除失败
console.log(str.length); / / 7
当对象的属性删除:
var obj = {姓名:'wenzi,年龄:25 };
console.log(对象的名字); / /文
console.log(删除对象的名字); / /真实,删除成功
console.log(对象的名字); / /未定义
console.log(obj); / / { 25 }年龄:
对象属性删除,从结果可以看到下面的输出,使用DELETE删除属性,只删除对象本身的属性的实例,但不能删除原型属性,即使不删除的删除;属性或方法,如果你想删除的仅是原型属性:删除person.prototype.name:
功能人(){
this.name = 'wenzi;
}
person.prototype.name =蚊子;
学生=新人();
console.log(学生姓名); / /文
console.log(删除学生的名字); / /真实,删除成功
console.log(学生姓名); / /蚊子
console.log(删除学生的名字); / /真的
console.log(学生姓名); / /蚊子
console.log(删除的人。原型。名称); / /真实,删除成功
console.log(学生姓名); / /未定义
2的内部性质。js
在上面的例子中,一些变量或属性可以成功删除,而一些变量或属性不能被删除。什么决定了变量或属性是否可以被删除
ECMA-262第五版定义的JS对象属性的特征(比如JS引擎,无法直接从外部访问)。在ECMAscript两个属性:数据属性和访问性能。
2.1数据属性
数据属性是指在该位置读取或写入值的数据值的位置,该值有4个属性来确认其行为:
{ { } }:可显示你可以使用删除操作来删除它,重新定义它,或者你可以修改它的访问器的属性。默认的是真的;
{ { } }:指示是否可枚举属性可以返回通过在回路。默认为true;
{ { } }:表示是否可以修改属性的值。默认为true;
{ {价值} }:包含该属性的数据值。读/写的是价值。默认值是未定义的;如果name属性的实例对象的人的定义,价值is'wenzi ',和值的变化都在这个位置。
修改默认对象的特征属性(默认为true),叫Object.defineProperty()方法,它接受三个参数:对象的属性,属性名和描述对象(必须是:可配置、可枚举,可写的价值,具有一个或多个值)。
如下:
var;
object.defineproperty(人,'name',{)
配置:假 / /不能删除,不能修改属性的访问器
可写:false不能被修改
价值的价值:'wenzi ' / /的名字是Wenzi
});
console.log(人的名字); / /文
console.log(删除的人的名字); / /错误,无法删除
Person.name ='lily';
console.log(人的名字); / /文
我们可以看到,删除和重置,不person.name值有效,这是因为电话defineproperty函数修改对象的特性;值得注意的是,一旦配置设置为false,将无法再使用defineproperty修改真实(执行错误:Uncaught TypeError:不能重定义属性:名称);
2.2访问属性
它主要包括一对吸气剂和二传手功能。阅读访问属性时,它将调用getter返回有效值;写访问属性时,它调用setter和写入新值;属性有以下4个特点。
{可配置}:是否可以通过删除运算符删除重新定义的属性;
{ { } }:可列属性是否可以通过实物发现;
{ } }:读取属性时自动调用,默认值为:未定义;
{ } }:在写入属性时自动调用,默认值为:未定义;
存取属性不能直接定义,必须使用defineproperty(),定义如下:
var
_age:18
};
object.defineproperty(人,'isadult,{)
可配置:false,
获取:函数(){
如果(这。_age > = 18){
返回true;
{人}
返回false;
}
}
});
console.log(人。isadult); / /真的
然而,还有一点需要注意。当Object.defineProperty()方法设置属性,它不能同时声明访问属性(设置和获取)和数据属性(可写或价值)的同时,它意味着一个属性可写或价值属性,使物业不能宣布获得和设置,反之亦然。
如果在下面的方式定义,存取属性和数据属性同时存在:
var;
object.defineproperty(O,'name',{)
价值:'wenzi,
设置:函数(名称){
MyName = name;
},
获取:函数(){
返回我的名字;
}
});
上面的代码看起来没有什么问题,但是真正的执行是错误的,下面是:
Uncaught TypeError:无效的属性。一个属性不能有访问器和
数据属性,你可以得到它:可配置、可枚举,可与价值;
用于访问属性,你可以得到它:可配置、可枚举,得到,并设置。
由此我们可以看出,变量或属性是否可以被其内部属性可配置控制。如果可配置为true,则可以删除变量或属性,否则不能删除。
但是我们应该如何获得这个可配置的值,并且不能尝试删除它,有一种方法可以删除它!
2.3获得内部属性
ES5为我们提供了Object.getOwnPropertyDescriptor(对象属性)得到的内部特性。
如:
无功的人= {姓名:'wenzi};
无功者= object.getownpropertydescriptor(人,'name'); / /个人名称属性
console.log(者); / / {价值:文字,可写的:真的,真的,真的可枚举:可配置:}
通过Object.getOwnPropertyDescriptor(对象属性),我们可以得到4的内部属性,可控制是否变量或属性可以删除。在这个例子中,对person.name配置是正确的,并解释说,它可以被删除。
console.log(人的名字); / /文
console.log(删除的人的名字); / /真实,删除成功
console.log(人的名字); / /未定义
让我们回到采访的开始。
a = 1;
无功者= object.getownpropertydescriptor(窗口,'a');
console.log(DESP。可配置); / /真的,可以删除
var b=2;
无功者= object.getownpropertydescriptor(窗口,B);
console.log(DESP。可配置); / /错误,无法删除
结果与我们使用删除操作删除变量相同。
三.总结
不要看简单的删除操作,它包含很多原则。