1. 程式人生 > >JavaScript中四種不同的屬性檢測方式比較

JavaScript中四種不同的屬性檢測方式比較

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中四種不同的屬性檢測方式比較