在JavaScript中,是否存在不使用点表示法或括号表示法获取对象属性的任何方法?

时间:2018-09-21 01:34:47

标签: javascript syntax

假设我有一个简单的对象a = {b: 2}。我知道两种获取a的属性b的值的方法:

点表示法:a.b // 2

括号符号:a['b'] // 2

除了实用性之外,是否存在不使用这两种方法(点表示法和方括号表示法)中的任何一种从对象a获取b值的方法? MDN's page on Property Accessors仅列出了两种方法。


这只是我的好奇心。我知道存在不带括号的调用函数的晦涩方式,例如

parseInt`5.1`

我想看看是否可以进行类似的模糊属性访问。

3 个答案:

答案 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

它不会搜索原型链,但它可用于立即属性,并且值得注意,因为您可以使用它来进行递归函数搜索原型链:)