《JS权威指南学习总结--6.4检测属性》

内容要点:

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

一.in运算符

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

     var o = {x:1}

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

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

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

二.hasOwnPproperty()方法

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

    var o= {x:1}

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

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

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

三.propertyIsEnumerable()方法

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

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

    o.x=1;

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

    o.propertyIsEnumberable("y"); //false,y是继承来的。

   Object.property.propertyIsEnumberable("toString");  //false:不可枚举

四.

  除了使用in运算符之外,另一种更简单的方法是使用"!=="判断一个属性是否是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; //fasle,属性不存在

 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;

                             

原文地址:https://www.cnblogs.com/hanxuming/p/5793000.html