<meta name="keywords" content="华夏棋牌,外下属性,delete,操作符" />
华夏棋牌 > web前端 > js教程 > 注释

js中的外下属性与delete操作符简介_javascript手艺

原创 2016-05-16 15:46:04 0 157
赞助会员专享特权
在解说Configurable华夏棋牌之前,我们首先来看一道面试题:

a = 1;
console.log( window.a ); // 1
console.log( delete window.a ); // true
console.log( window.a ); // undefined

var b = 2;
console.log( window.b ); // 2
console.log( delete window.b ); // false
console.log( window.b ); // 2

从下面的这道题可以看出两个的差异:在没有应用var声明变量时,应用delete要害词是可以阻拦删除的,再次取得市价就是undefined了;在应用var声明的变量,应用delete是不克不及删除的,再取得市价依然是2。

1. delete操作符

应用delete删除变量或属性时,删除告成前往true,否则前往false。以下面的例子中,delete没法删除变量a时,则前往false;而delete能告成删除变量b,则前往true。

除上述的两种情形,尚有其他的种种经常应用变量也有能被delete删除的,也有不克不及被删除的。我们先岂论delete华夏棋牌这些变量时,为甚么会发生这样的效果,这里只看他的前往值:

删除delete数组中其中的一个元素:

// 应用for~in是循环不到的,直接忽视到该元素
// 应用for()可以取得该元素,然则值是undefined
var arr = [1, 2, 3, 4];
console.log( arr );     	// [1, 2, 3, 4]
console.log( delete arr[2] );	// true,删除告成
console.log( arr );      	// [1, 2, undefined, 4]

删除function类型的变量:

// chrome 不克不及删除;火狐可以删除
function func(){
}
console.log( func );
console.log( delete func );
console.log( func );

华夏棋牌删除function.length,该length是取得形参的个数:

function func1(a, b){
}
console.log( func1.length );   	// 2
console.log( delete func1.length );	// true,删除告成
console.log( func1.length );   	// 0

删除经常应用变量:

console.log( delete NaN );  	// false,删除掉落败
console.log( delete undefined );// false
console.log( delete Infinity );	// false
console.log( delete null );  	// true,删除告成

删除prototype,而不是删除prototype上的属性:

function Person(){
}
Person.prototype.name = "蚊子";
console.log( delete Person.prototype );	// false,没法删除
console.log( delete Object.prototype );	// false

删除数组和字符串的length时:

var arr = [1, 2, 3, 4];
console.log( arr.length );    	// 4
console.log( delete arr.length ); 	// false,删除掉落败
console.log( arr.length );    	// 4

var str = 'abcdefg';
console.log( str.length );    	// 7
console.log( delete str.length ); 	// false,删除掉落败
console.log( str.length );    	// 7

华夏棋牌删除obj中的属性时:

var obj = {name:'wenzi', age:25};
console.log( obj.name );   	// wenzi
console.log( delete obj.name );	// true,删除告成
console.log( obj.name );   	// undefined
console.log( obj );      	// { age:25 }

删除实例工具中的属性时,从以下的输入效果可以看出,应用delete删除属性时,删除的仅仅是实例工具自己的属性,而不克不及删除prototype上的属性,纵然再删一次也是删除掉落落不的;若要删除prototype上的属性的属性或措施,只能是:delete Person.prototype.name

function Person(){
  this.name = 'wenzi';
}
Person.prototype.name = '蚊子';
var student = new Person();
console.log( student.name );    // wenzi
console.log( delete student.name ); // true,删除告成
console.log( student.name );    // 蚊子
console.log( delete student.name ); // true
console.log( student.name );    // 蚊子
console.log( delete Person.prototype.name );// true,删除告成
console.log( student.name );    // undefined

2. js的外下属性

不才面的例子中,有的变量或属性能够删除告成,而有的变量或属性则没法阻拦删除,那是甚么决议这个变量或属性能不克不及被删除呢。

ECMA-262第5版界说了JS工具属性中特点(用于JS引擎,外部没法直接会见)。ECMAScript中有两种属性:数据属性和会见器属性。

2.1 数据属性

数据属性指网罗一个数据值的职位,可在该职位读取或写入值,该属性有4个供述其行动的特点:

  • [[configurable]]:体现能否应用delete操作符删除从而重新界说,或能否修改成会见器属性。默许为true;
  • [[Enumberable]]:体现能否可经由历程for-in循环前往属性。默许true;
  • [[Writable]]:体现能否可修改属性的值。默许true;
  • [[Value]]:网罗该属性的数据值。读取/写入都是该值。默许为undefined;以下面实例工具Person中界说了name属性,其值为'wenzi',对该值的修改都横竖在这个职位

华夏棋牌要修改工具属性的默许特点(默许都为true),可挪用Object.defineProperty()措施,它吸收三个参数:属性所在工具,属性名和一个形貌符工具(必须是:configurable、enumberable、writable和value,可设置一个或多个值)。

以下:

var person = {};
Object.defineProperty(person, 'name', {
  configurable: false,	// 弗成删除,且不克不及修改成会见器属性
  writable: false,		// 弗成修改
  value: 'wenzi'			// name的值为wenzi
});
console.log( person.name);			// wenzi
console.log( delete person.name );	// false,没法删除
person.name = 'lily';
console.log( person.name );			// wenzi

华夏棋牌可以看出,delete及重置person.name的值都没有掉效,这就是由于挪用defineProperty函数修改了工具属性的特点;值得重视的是一旦将configurable设置为false,则没法再应用defineProperty将其修改成true(推行会报错:Uncaught TypeError: Cannot redefine property: name);

2.2 会见器属性

它主要网罗一对getter和setter函数,在读取会见器属性时,会挪用getter前往有用值;写入会见器属性时,挪用setter,写入新值;该属性有以下4个特点:

  • [[Configurable]]:能否可经由历程delete操作符删除重新界说属性;
  • [[Numberable]]:能否可经由历程for-in循环查找该属性;
  • [[Get]]:读取属性时自动挪用,默许:undefined;
  • [[Set]]:写入属性时自动挪用,默许:undefined;

华夏棋牌会见器属性不克不及直接界说,必须应用defineProperty()来界说,以下:

var person = {
  _age: 18
};
Object.defineProperty(person, 'isAdult', {
	Configurable : false,
  get: function () {
    if (this._age >= 18) {
      return true;
    } else {
      return false;
    }
  }
});
console.log( person.isAdult ); // true

不外还是有一点须要特殊重视一下,Object.defineProperty()措施设置属性时,不克不及同时声明会见器属性(set和get)和数据属性(writable或许value)。意思就是,某个属性设置了writable或许value属性,那么这个属性就不克不及声明get和set了,反之亦然。

如若像下面的要领阻拦界说,会见器属性和数据属性同时存在:

var o = {};
Object.defineProperty(o, 'name', {
  value: 'wenzi',
  set: function(name) {
    myName = name;
  },
  get: function() {
    return myName;
  }
});

下面的代码看起来貌似是没有甚么效果,但是真正推行时会报错,报错以下:

Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value

关于数据属性,可以取得:configurable,enumberable,writable和value;

关于会见器属性,可以取得:configurable,enumberable,get和set。

由此我们可知:一个变量或属性能否可以被删除,是由其外下属性Configurable阻拦控制的,若Configurable为true,则该变量或属性可以被删除,否则不克不及被删除。

可是我们应当怎样取得这个Configurable值呢,总不克不及用delete尝尝能不克不及删除吧。有措施滴!!

2.3 取得外下属性

ES5为我们供应了Object.getOwnPropertyDescriptor(object, property)来取得外下属性。

如:

var person = {name:'wenzi'};
var desp = Object.getOwnPropertyDescriptor(person, 'name'); // person中的name属性
console.log( desp );	// {value: "wenzi", writable: true, enumerable: true, configurable: true}

经由历程Object.getOwnPropertyDescriptor(object, property)我们能够获得得4个外下属性,configurable控制着变量或属性能否可被删除。这个例子中,person.name的configurable是true,则诠释是可以被删除的:

console.log( person.name );			// wenzi
console.log( delete person.name );	// true,删除告成
console.log( person.name );			// undefined

华夏棋牌我们再回到最泉源的谁人面试题:

a = 1;
var desp = Object.getOwnPropertyDescriptor(window, 'a');
console.log( desp.configurable ); 	// true,可以删除

var b = 2;
var desp = Object.getOwnPropertyDescriptor(window, 'b');
console.log( desp.configurable ); 	// false,不克不及删除

跟我们应用delete操作删除变量时发生的效果是一样的。

3. 总结

别看一个简质朴单的delete操作,外面着实网罗了许多的原理!

php中文网最新课程二维码
  • 相关标签:外下属性 delete 操作符
  • 本文原创宣布php中文网 ,转载请注明出处,谢谢您的尊重!
  • 相关文章


  • 原生javascript完因素享到同伙圈功效 支持ios和android_javascript手艺
  • jQuery链式挪用与show知识浅析_jquery
  • JS完成登录页面记着密码和enter键登录措施推荐_javascript手艺
  • BootstrapTable与KnockoutJS相联络完成增删改查功效【一】_javascript手艺
  • js中的外下属性与delete操作符简介_javascript手艺
  • 网友议论

    文明上彀理性语言,请遵守 新闻议论服务协定

    我要议论

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国际最盛行的中文PHP开发框架,也是您Web项目的最好选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架知识泉源,将...

    • 2017-05-16 12:03:57
    • 点击数(173543)

    独孤九贱(4)_PHP视频教程

    江湖传言:PHP是天下上最好的编程语言。真的是这样吗?这个梗现实是从哪来的?学会本课程,你就会明确了。 华夏棋牌-万豪棋牌电玩城-微信娱乐棋牌出品的PHP入门系统教授修养视频,完全从初学者的角度出发,绝不玩虚的,一切以适用、有用...

    • 2017-03-20 22:47:17
    • 点击数(169666)

    独孤九贱(1)_HTML5视频教程

    华夏棋牌《php.cn原创html5视频教程》课程特点:php中文网原创滑稽段子系列课程,以恶弄,段子为主题气焰气焰的php视频教程!轻松的教授修养气焰气焰,杂乱的教授修养形式,让同砚们在不知不觉中,学会了HTML知识。 ...

    • 2017-03-13 10:15:11
    • 点击数(137120)

    ThinkPHP5实战之[教授修养治理系统]

    华夏棋牌本套教程,以一个真实的黉舍教授修养治理系统为案例,手把手教会您怎样在一张白纸上,从零泉源,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    • 2017-07-24 16:48:56
    • 点击数(130403)

    PHP入门视频教程之一周学会PHP

    一切盘算机语言的学习都要从根原泉源,《PHP入门视频教程之一周学会PHP》不只是PHP的基础部门更主要的是PHP语言的焦点手艺,是学习PHP必须控制的内容,任何PHP项目的完成都离不开这部门的内容,通...

    • 2016-11-16 14:54:14
    • 点击数(129771)

    作者信息

    php中文网

    认证0级讲师

    比来文章

    相关视频教程

  • javascript低级视频教程
  • jquery 基础视频教程
  • javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程
  • 相关视频章节