返回

JavaScript 对象字面量中变量作为键值的艺术

javascript

在 JavaScript 对象字面量中巧妙使用变量作为键值

背景

在使用 JavaScript 对象字面量时,您可能会遇到需要将变量指定为键值的情况。本文将深入探讨如何优雅地实现这一点,同时提供一个实用的解决方案。

问题

让我们考虑一个场景:您希望根据某些元素的名称及其值创建一个 JavaScript 对象。例如:

// DOM 元素
<div class="quantity">
  <input name="item1" value="1">
  <input name="item2" value="2">
</div>

使用传统的方法,您可能会尝试使用 map() 函数创建一个对象数组:

const inputs = $('div.quantity > input').map(function(){
  return { key: this.attr('name'), value: this.attr('value') };
});

然而,这种方法会返回一个带有重复键的对象数组:

[ { key: 'item1', value: '1' }, { key: 'item2', value: '2' } ]

问题在于 key 是一个对象属性,而不是一个 JavaScript 对象字面量的有效键。

解决方案

为了解决这个问题,我们需要使用一个称为 计算属性名 (Computed Property Names) 的特性。这允许我们使用 JavaScript 表达式动态地生成对象键。

const inputs = $('div.quantity > input').map(function(){
  return { [this.attr('name')]: this.attr('value') };
});

现在,键值将是 this.attr('name') 的值:

{ item1: '1', item2: '2' }

深入理解

计算属性名的工作原理如下:

  1. 中括号 [] 周围的表达式将求值,得到一个字符串。
  2. 该字符串将用作对象属性的键。

这允许我们使用变量、函数调用和任何其他 JavaScript 表达式来动态地创建键值。

优势

使用计算属性名有几个优点:

  • 灵活: 它允许您根据需要轻松地创建复杂的键值。
  • 可读性: 这使代码更具可读性和可维护性,因为键值是显式的。
  • 性能: 它比其他方法(例如使用 Object.defineProperty())更有效。

常见问题解答

Q1:我可以用计算属性名来创建嵌套对象吗?
A1: 是的,您可以使用嵌套表达式创建嵌套对象。

Q2:我可以使用计算属性名来覆盖现有键吗?
A2: 是的,如果您将相同的键多次用于计算属性名,则后面的值将覆盖前面的值。

Q3:计算属性名的名称需要使用引号吗?
A3: 如果键值是标识符,则不需要引号。然而,如果您使用特殊字符或要使用字符串,则需要引号。

Q4:计算属性名可以在哪些情况下使用?
A4: 计算属性名可以在对象字面量、对象解构和类中的方法和访问器中使用。

Q5:使用计算属性名有什么限制?
A5: 计算属性名需要 ECMAScript 2015 及更高版本的支持。在旧版本中,您需要使用其他方法,例如 Object.defineProperty()

结论

在 JavaScript 对象字面量中使用计算属性名是一种强大且灵活的方法,可以创建具有动态键值的对象。这提高了代码的可读性、可维护性和性能。通过理解本文中讨论的概念,您可以自信地使用此特性来构建更健壮和高效的 JavaScript 应用程序。