hasOwnProperty
hasOwnProperty
可以用来判断是否为实例属性还是原型属性。
const obj1 = {
happy:100
}
// 以obj1原型创建obj2
const obj2 = Object.create(obj1);
obj2.happy;//100 可以访问到原型的happy属性
obj2.hasOwnProperty('happy'); //obj2 自身没有happy属性
obj1.hasOwnProperty('happy'); //obj1拥有happy属性
in
有两种方式使用 in
操作符:单独使用和在 for-in
循环中使用。
-
单独使用时,无论属性是在原型上还是在实例上,都会返回
true
。 -
在
for-in
循环中使用in
操作符时,可以通过对象访问且可以被枚举的属性都会返回,包括实例属性和原型属性。
'happy' in obj2; //true
for (let i in obj2) {
console.log(i); // happy
}
Object.keys()
Object.keys()
获得对象(实例)上所有可枚举的实例属性。
Object.keys(obj1); //['happy']
Object.keys(obj2); //[]
Object.getOwnPropertyNames()
Object.getOwnPropertyNames()
用于列出对象(实例)的所有属性,无论是否可以枚举。
// 给obj2添加一个不可枚举的属性
Object.defineProperty(obj2, 'sad', {
value: 0,
enumerable:false //不可枚举
//其实不用写这个,只要通过这种方式添加属性,enumerable,configurable,writable都会默认设置为false
})
Object.keys(obj2); // []
Object.getOwnPropertyNames(obj2); //['sad'] 可以列举出属于对象的不可枚举属性
Object.getOwnPropertyDescriptor(obj2, 'sad') // 获取属性的配置
// {value: 0, writable: false, enumerable: false, configurable: false }
Object.getOwnPropertySymbols()
ES6增加了符号类型后,也就相应地增加了Object.getOwnPropertySymbols()
方法。因为以符号为键的属性没有名称的概念。
const obj3 = {
name: 'jiaqi',
age: 110,
[Symbol('name')]:'jiaqicoder'
}
Object.getOwnPropertyNames(obj3); //[ 'name', 'age' ]
Object.getOwnPropertySymbols(obj3); //[ Symbol(name) ]
Object.keys(obj3); //[ 'name', 'age' ]
for (let i in obj3) {
console.log(i); //name , age
}
Object.values()与Object.entries()
前面都是一些获取属性键名的方法,而 Object.values()
和 Object.entries()
接收一个对象,返回它们内容的数组。Object.values()
返回对象值的数组,Object.entries()
返回键/值对的数组。
let obj4 = {
name: 'jiaqi',
age: 22,
hobbies:{}
}
Object.keys(obj4); //[ 'name', 'age', 'hobbies' ]
Object.values(obj4); //[ 'jiaqi', 22, {} ]
Object.entries(obj4); //[ [ 'name', 'jiaqi' ], [ 'age', 22 ], [ 'hobbies', {} ] ]
-
上面两个方法执行对象的复制
obj4.hobbies === Object.values(obj4)[2]; obj4.hobbies === Object.entries(obj4)[2][1];
-
符号属性会被忽略