一味宠爱|第30节 检测和枚举属性-Javascript-零点程序员-王唯
本内容是《Web前端开发之Javascript视频》的课件 , 请配合大师哥《Javascript》视频课程学习 。
检测属性:
ES对象可以看作是属性的集合 , 在实际场景中 , 会经常检测集合中成员的所属关系 , 比如 , 判断某个属性是否存在于某个对象中;可以通过in运算符、hasOwnProperty和propertyIsEnumerable方法来完成 , 甚至仅通过属性可以做到;
hasOwnProperty()方法:可以检测一个属性是存在于实例中 , 还是存在于原型中;即给定属性存在于对象实例中 , 才会返回true , 继承属性返回false , 如:
var p1 = new Person();var p2 = new Person();alert(p1.hasOwnProperty("name")); // falsep1.name = "wujing";alert(p1.hasOwnProperty("name")); // truedelete p1.name;alert(p1.name);// wangweialert(p1.hasOwnProperty("name"));// falsepropertyIsEnumerable()是hasOwnProperty的增强版 , 只有检测到是实例属性且这个属性是可枚举的它才返回true;如:
var o = {x:1};var obj = Object.create(o);obj.y = 1;console.log(o.propertyIsEnumerable("x"));trueconsole.log(obj.propertyIsEnumerable("x"));trueconsole.log(obj.propertyIsEnumerable("y"));trueconsole.log(Object.prototype.propertyIsEnumerable("toString"));//false , 不可枚举in操作符:
in操作符会通过对象能够访问给定属性时返回true , 无论属性存在于实例中还是原型中:
alert(p1.hasOwnProperty("name"));// falsealert("name" in p1);// true除了in操作符 , 更为便捷的方式是使用“!==”判断一个属性是否是undefined , 如:
var o = {x:1};o.x !== undefined;// trueo.y !== undefined;// falseo.toString != undefined; // true,o继承了toString有一种场景只能使用in而不能使用上述属性访问的方式 , in可以区分该属性存在但值为undefined的情景 , 如:
var o = {x:undefined};o.x !== undefined//false,属性存在 , 但值为undefinedo.y !== undefined // false , 属性不存在"x" in o;// true,属性存在"y" in o; // flase,属性不存在delete o.x;"x" in o; // false在使用”!==”时 , 要注意其与“!=”不同点 , “!==”可以区分undefined和null , 如:
var o={x:2};// 如果o中存在属性x,且x的值不是null或undefined , 则o.x乘以2if(o.x != null) o.x *= 2;// 如果o中存在属性x , 且x的值不能转换为false , o.x乘以2// 如果x是undefined、null、false、“ ”、0或NaN , 则它保持不变if(o.x) o.x *=2;同时使用hasOwnProperty()方法和in操作符 , 可以确定该属性是存在于对象还是原型中;
// 判断是否为原型var p1 = new Person();// p1.name = "wujing";// 添加此名就会返回falsefunction hasPrototypeProperty(object, name){return !object.hasOwnProperty(name) }alert(hasPrototypeProperty(p1,"name"));// true// 或者:var obj = {name:"wang",age:100,sex:'male',__proto__:{lastName:"wei"}}Object.prototype.height = '178CM';for(var p in obj){if(obj.hasOwnProperty(p)){console.log(obj[p]);}}枚举属性:
除了检测对象的属性是否存在 , 还会经常遍历对象的属性;通常使用for/in循环遍历 , 但ES还提供了两个更好的方案;
for-in:可以遍历所有能够通过对象访问的、可枚举的(enumerated)属性 , 其中既包括存在于实例中的属性 , 也包括存在原型中的属性;
var o = {x:1,y:2,z:3};Object.defineProperty(o,"z",{value:4,enumerable:false});console.log(o.z);for(p in o)console.log(p);function Person(){this.name="wangwei";this.age=10;}Person.prototype.toString = function(){return "wangwei";}var p1 = new Person();Object.defineProperty(p1,"age",{value:18,enumerable:false});for(prop in p1)console.log(prop + ":" + p1[prop]);
推荐阅读
- 时尚@人到中年,一味扮嫩早就行不通了,这几个颜色才时尚高级
- 鬼才狗仔|蔡徐坤郑恺同时给baby递吃的,得到回应不同,还是弟弟受宠爱
- 洗米华@洗米华宠爱Mandy,生第1胎奖励大别墅,二胎就是她注定成功的筹码
- 历史很奇葩|深得慈禧宠爱,25岁落了个身首异处的下场,他10岁净身入宫
- 一味宠爱|小米发力,新机价格松动,还有骁龙765G+256GB+50倍变焦加持
- 秦汉|他是汉武帝第一个皇后,却不受汉武帝的宠爱,晚年在长门宫中终老
- 一味宠爱|共筑新零售|云徙科技荣膺阿里云新零售合作计划核心伙伴
- 一味宠爱|华为推出新系统替换谷歌GMS后!海外用户依旧不买账:销量持续大跌
- 一味宠爱|华为手机首次登上全球第一!国外机构如此评价
- 一味宠爱|男子骑共享单车遗落手包 多亏遇到了他......
