:点上面关注免费学习前端知识!
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前端精髓