JavaScript中四種不同的屬性檢測方式比較
阿新 • • 發佈:2017-08-26
bject 如果 cnblogs thead != () 繼承 rip left
JavaScript中四種不同的屬性檢測方式比較
1. 用in方法
var o = {x:1}; "x" in o; //true "y" in o; //false "toString" in o; //true,繼承屬性可以被檢測到 "toString" in Object.prototype; //true,不可枚舉的屬性可以被檢測到
2. hasOwnProperty()方法
var o = {x:1}; o.hasOwnProperty("x"); //true o.hasOwnProperty("y"); //false o.hasOwnProperty("toString"); //false,無法檢測繼承屬性Object.prototype.hasOwnProperty("toString"); //true,不可枚舉的屬性可以被檢測到
3. propertyIsEnumerable()方法
var o = Object.create({y:2}); o.x = 1; o.propertyIsEnumerable("x"); //true,x是可枚舉的屬性 o.propertyIsEnumerable("y"); //false,繼承屬性,不可枚舉 Object.prototype.propertyIsEnumerable("toString"); //false,不可枚舉的屬性無法被檢測
4. !== undefined方法
var o = {x : 1}; o.x !== undefined; //true,o中有屬性x o.toString !== undefined; //true,繼承屬性也可以被檢測到
這種方法的一個弱點是,無法區分不存在的屬性和存在但值為undefined的值,如:
var o = {x : undefined}; o.x !== undefined; //false "x" in o; //true
註意這裏用的是"!=="而不是"!=",因為"!=="可以區分undefined和null。
但有時候不用區分"null"和"undefined",只要判斷一個屬性不是null或undefined即可。
//如果o含有屬性x,且x的值不是undefined或null,o.x乘以2 if(o.x != null) o.x *= 2;
繼承屬性是不可枚舉的,所以能檢測繼承屬性的,肯定也能檢測到不可枚舉屬性。
×表示無法檢測,√表示可以檢測
檢測方法 | 不可枚舉屬性? | 繼承屬性? |
---|---|---|
in | √ | √ |
hasOwnProperty | √ | × |
propertyIsEnumerable | × | × |
!== | √ | √ |
JavaScript中四種不同的屬性檢測方式比較