假设我有一个简单的对象a = {b: 2}
。我知道两种获取a的属性b的值的方法:
点表示法:a.b // 2
和
括号符号:a['b'] // 2
除了实用性之外,是否存在不使用这两种方法(点表示法和方括号表示法)中的任何一种从对象a获取b值的方法? MDN's page on Property Accessors仅列出了两种方法。
这只是我的好奇心。我知道存在不带括号的调用函数的晦涩方式,例如
parseInt`5.1`
我想看看是否可以进行类似的模糊属性访问。
答案 0 :(得分:3)
首先想到的是Object.values
const a = {b: 2}
Object.values(a).forEach(v => {
console.info(v)
})
但是您怎么知道您正在访问什么密钥?
我想还有Object.entries()
const a = {b: 2}
Object.entries(a).forEach(entry => {
// entries are [key, value] arrays
let value = entry.pop()
let key = entry.pop()
console.info(key, ':', value)
})
注意:我使用Array.prototype.pop()
是为了不使用“括号符号” 。
答案 1 :(得分:3)
这与访问属性不完全不同,但是如果您使用的是最新的JS(es6 +),它仍然是一种偷偷摸摸的获取对象内容的方法。这几天所有时髦的JS孩子都在做。
const { b } = a
console.log(b) // 2
这称为 destructuring ,它适用于对象和数组,您可以在此处了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
答案 2 :(得分:2)
别忘了Object.getOwnPropertyDescriptor()
:
const object1 = {
property1: 42
}
const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');
console.log(descriptor1.value);//42
它不会搜索原型链,但它可用于立即属性,并且值得注意,因为您可以使用它来进行递归函数搜索原型链:)