检测属性

点上面关注免费学习前端知识!



JavaScript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系——判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。


in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true:


var o={x:1}

"x"in o;//true:"x"是o的属性

"y"in o;//false:"y"不是o的属性

"toString"in o;//true:o继承toString属性


对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自有属性。对于继承属性它将返回false:


var o={x:1}

o.hasOwnProperty("x");//true:o有一个自有属性x

o.hasOwnProperty("y");//false:o中不存在属性y

o.hasOwnProperty("toString");//false:toString是继承属性


propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到是自有属性且这个属性的可枚举性(enumerable attribute)为true时它才返回true。某些内置属性是不可枚举的。通常由JavaScript代码创建的属性都是可枚举的,除非在ECMAScript 5中使用一个特殊的方法来改变属性的可枚举性,随后会提到:


var o=inherit({y:2});

o.x=1;

o.propertyIsEnumerable("x");//true:o有一个可枚举的自有属性x

o.propertyIsEnumerable("y");//false:y是继承来的

Object.prototype.propertyIsEnumerable("toString");//false:不可枚举


除了使用i n运算符之外,另一种更简便的方法是使用“!==”判断一个属性是否是undefined:


var o={x:1}

o.x!==undefined;//true:o中有属性x

o.y!==undefined;//false:o中没有属性y

o.toString!==undefined;//true:o继承了toString属性


然而有一种场景只能使用in运算符而不能使用上述属性访问的方式。in可以区分不存在的属性和存在但值为undefined的属性。例如下面的代码:


var o={x:undefined}//属性被显式赋值为undefined

o.x!==undefined//false:属性存在,但值为undefined

o.y!==undefined//false:属性不存在

"x"in o//true:属性存在

"y"in o//false:属性不存在

delete o.x;//删除了属性x

"x"in o//false:属性不再存在


注意,上述代码中使用的是“!==”运算符,而不是“!=”。“!==”可以区分undefined和null。有时则不必作这种区分:


//如果o中含有属性x,且x的值不是null或undefined,o.x乘以2.

if(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;


看前端技术文字,就在Web前端精髓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值