考虑几种情况:
1. 有可能 属性是在自身上的属性
2. 属性 可能在 原型链上 obj.__proto__
比如:
const obj = {
name: 'zs',
age: 12
};
const s = Symbol('unique')
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
age: '13',
// 定义symbol类型的值
[s]: 'symbol'
});
在原型上的属性判断...
结果:
1. in 关键字既可以判断自生是否存在属性,也可以判断__proto__ 上的属性
2. for in 循环 可以循环 自身 和 原型链上的所有属性
// 1. in 关键字判断
function hasProp (obj, key) {
return key in obj
}
in 关键字也可以判断 symbol 类型的属性
const obj = {
name: 'zs',
age: 12
};
const s = Symbol('unique')
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
age: '13',
[s]: 'symbol'
});
console.log(s in obj); // true
扩展:
对象循环的几种方式:
1. for in 循环 , 遍历自身和原型上的可枚举属性
symbol 类型的属性遍历不出
const obj = {
name: 'zs',
age: 12
};
// 定义属性
Object.defineProperties(obj, {
high: {
value: '180',
// 是否可枚举
enumerable: false
},
weight: {
value: 140,
enumerable: true,
}
})
const s = Symbol('unique')
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
age: '13',
[s]: 'symbol'
});
for(let key in obj) {
console.log(key);
}
输出的结果如下图所示:
2. Object.keys, Object.vlaues, Object.entries 遍历自身可枚举的属性。
不包括 原型 和 symbol类型的属性
const s1 = Symbol('test1');
const s2 = Symbol.for('test2');
const obj = {
name: 'zs',
age: 12,
[s1]: 'test1'
};
Object.defineProperties(obj, {
high: {
value: '180',
enumerable: false
},
weight: {
value: 140,
enumerable: true,
}
})
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
[s2]: 'test2'
});
console.log(Object.keys(obj));
console.log(Object.values(obj));
console.log(Object.entries(obj));
Object.keys(obj) , Object.values(), Object.entries() 结果如图所示:
3. Object.getOwnPropertyNames(obj) 遍历自身属性,不包含symbol类型
不可枚举属性也能遍历出
const s1 = Symbol('test1');
const s2 = Symbol.for('test2');
const obj = {
name: 'zs',
age: 12,
[s1]: 'test1'
};
Object.defineProperties(obj, {
high: {
value: '180',
enumerable: false
},
weight: {
value: 140,
enumerable: true,
}
})
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
[s2]: 'test2'
});
console.log(Object.getOwnPropertyNames(obj));
4. Object.assign({}, obj) 拷贝自身可枚举的属性 包括symbol; 不包含原型上的属性
注意:如果属性重复,后面的属性值替换前面的属性值
const s1 = Symbol('test1');
const s2 = Symbol.for('test2');
const obj = {
name: 'zs',
age: 12,
[s1]: 'test1'
};
Object.defineProperties(obj, {
high: {
value: '180',
enumerable: false
},
weight: {
value: 140,
enumerable: true,
}
})
// 定义原型上
Object.setPrototypeOf(obj, {
father: 'zz',
[s2]: 'test2'
});
console.log(Object.assign({}, obj));
拷贝结果如下: