对对象中的key值进行遍历
对象中的属性分为两种类型,字符串和Symbol。
如果我们使用除字符串和Symbol之外的类型最后都会变成字符串。
var objProp = {}
var obj = {
[objProp]: 'obj'
}
console.log(obj);//{ '[object Object]': 'obj' }
var obj = {
str: 'str-value',
[Symbol()]: 'Symbol()-value'
}
// defineProperty方法可以直接再一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回此对象。
//定义一个不可枚举属性
Object.defineProperty(obj, 'unenum', {
value: '不可枚举unenum',
writeable: true,//是否可以被赋值运算符改变
enumerable: false,//是否出现在枚举属性中
configurable: true//是否可以改变和删除
})
//定义一个不可枚举属性
Object.defineProperty(obj, Symbol('unenum'), {
value: '不可枚举Symbol("unenum")-value',
writeable: true,
enumerable: false,
configurable: true
})
//在对象的原型上添加属性
Object.setPrototypeOf(obj, { foo: '原型bar-value', [Symbol('foo')]: '原型Symbol("foo")-value' })
上述代码输入obj为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ur589o1E-1661955777441)(…/image/Interview-index-1.png)];
console.log(Object.keys(obj));//[ 'str' ]
console.log(Object.values(obj));//[ 'str-value' ]
console.log(Object.entries(obj));//[ [ 'str', 'str-value' ] ]
console.log(Object.getOwnPropertyNames(obj));//[ 'str', 'unenum' ]
console.log(Object.getOwnPropertySymbols(obj));//[ Symbol(), Symbol(unenum) ]
console.log(Reflect.ownKeys(obj));//[ 'str', 'unenum', Symbol(), Symbol(unenum) ]
for(let prop in obj){
console.log(prop);//str -> foo
}
for…in和hasOwnProperty一起用就可以实现Object.keys()/Ojbect.values()/Object.entries()
hasOwnProperty是判断对象自身是否有指定的属性,也就是指定的key值。
for (let prop in obj) {
if (obj.hasOwnProperty(prop)) {
//{ key: 'str', value: 'str-value', pair: [ 'str', 'str-value' ] }
console.log({ key: prop, value: obj[prop], pair: [prop, obj[prop]] })
}
}