检测对象中属性的存在与否可以通过几种方法来判断。
方法一:使用in关键字
该方法可以判断对象的自有属性和继承来的属性是否存在(in能检测到原型链的属性)
var cat = {name:'Tom'};
console.log('name' in cat); //true 自有属性存在
console.log('weight' in cat); //false
console.log('toString' in cat); //true 继承属性存在
in关键字的使用
//数组中
//Array
var arr = ['cat','pig','dog','monkey','fish'];
console.log(0 in arr); //true
console.log(4 in arr); //true
console.log(5 in arr); //false
console.log('pig' in arr); //false 必须指定索引号,而不是该索引的值
console.log('length' in arr); //true length为该数组的属性
//预定义对象
console.log('PI' in Math); //true
//自定义对象
var cat = {name:'Tom',year:10};
console.log('name' in cat); //true
console.log('Tom' in cat); //false
//必须指定一个对象在操作的右边,比如你可以使用字符串构造函数创建字符串,而不是指定字符串
var color1 = new String('green');
console.log('length' in color1); //true
var color2 ='green';
console.log('length' in color2); //报措color2 is not a String object
//若使用delete删除属性,in操作将返回假
var cat = {name:'Tom',year:10};
delete cat.year;
console.log('year' in cat); //false
var arr = ['cat','pig','dog','monkey','fish'];
delete arr[0];
console.log(0 in arr); //false
//如果将某个属性设置为未定义但是不删除它,in操作将返回真
var cat = {name:'Tom',year:10};
cat.year = undefined;
console.log('year' in cat); //true
方法二:.使用对象的hasOwnProperty()方法
var obj = new Object();
obj.prop = 'exist';
function changeObj()
{
obj.newProp = obj.prop;
delete obj.prop;
};
console.log(obj.hasOwnProperty('prop')); // return true 自有属性存在prop
changeObj();
console.log(obj.hasOwnProperty('prop')); // return false 自有属性不存在prop
console.log(obj.hasOwnProperty('toString')); //return false 这是一个继承属性
hasOwnProperty的使用
//对象属性迭代
var cat = {Name:'Tom'};
for(var name in cat)
{
if(cat.hasOwnProperty(name))
{
alert('这只cat'+name+'的名字是'+cat[name]);
}
else
{
alert(name);
}
}
//使用hasOwnProperty作为属性名
var obj = {
hasOwnProperty: function()
{
return false;
},
bar: 'Hello'
};
console.log(obj.hasOwnProperty('bar')); //false
console.log(({}).hasOwnProperty.call(obj,'bar')); //true
console.log(Object.prototype.hasOwnProperty.call(obj, 'bar'));<span style="font-family: Arial, Helvetica, sans-serif;">//true</span>
方法三:.使用undefined方法
自有属性和继承属性均可判断。var cat = {name:'Tom'};
console.log(cat.name!==undefined); //true
console.log(cat.weight!==undefined); //false
console.log(cat.toString!==undefined); //true
该方法存在一个问题,如果属性的值就是undefined的话,该方法不能返回想要的结果,如下。
var cat = {name:'undefined'};
console.log(cat.name!==undefined); //false 属性存在 但是值是undefined
console.log(cat.weight!==undefined); //false
console.log(cat.toString!==undefined); //true