ES6支持用方括号包裹表达式定义计算属性名,表达式需同步返回字符串或可转为字符串的值;常见用法包括函数返回键名、闭包生成动态键、环境配置生成键等,需避免返回undefined、null或Promise。

ES6 允许在对象字面量中使用方括号 [] 包裹表达式来定义计算属性名(Computed Property Names),这个表达式可以是任意 JavaScript 表达式,包括函数调用。只要该表达式最终返回一个字符串(或可转为字符串的值),就能作为对象的键名。
函数返回字符串,直接用于计算属性名
最常见的方式是让函数返回一个合法的字符串键名,然后在对象中直接调用它:
function getKey(prefix) {
return `${prefix}_id`;
}
const user = {
[getKey('user')]: 101,
[getKey('role')]: 'admin'
};
console.log(user); // { user_id: 101, role_id: 'admin' }
结合闭包或配置生成动态键名策略
当需要复用逻辑或根据上下文动态生成键时,可将函数设计为返回键生成器:
const createKey = (namespace) => (field) => `${namespace}_${field}`;
const config = {
[createKey('api')('timeout')]: 5000,
[createKey('api')('baseURL')]: 'https://api.example.com'
};
console.log(config); // { api_timeout: 5000, api_baseURL: 'https://api.example.com' }
注意点:函数必须同步返回,且结果需为有效键名
计算属性名在对象创建时立即求值,因此函数不能是异步的(如返回 Promise),也不能依赖尚未初始化的变量。同时,返回值会被强制转为字符串,但应避免返回 undefined、null 或对象(除非明确希望其 toString() 结果作为键):
-
✅ 安全做法:返回字符串、数字、布尔值(如
true→"true") -
⚠️ 需谨慎:返回对象会调用
toString(),例如{}→"[object Object]",易引发冲突 -
❌ 不可行:返回
undefined→ 键名为"undefined",不是缺失键;返回Promise会导致键名为"[object Promise]"
实用场景示例:基于环境配置生成键
比如构建多环境 API 配置对象:
const ENV = 'prod';
function getApiPrefix() {
return ENV === 'dev' ? 'dev_api' : 'prod_api';
}
const apiConfig = {
[`${getApiPrefix()}_url`]: 'https://prod.example.com',
[`${getApiPrefix()}_version`]: 'v2'
};
console.log(apiConfig); // { prod_api_url: 'https://prod.example.com', prod_api_version: 'v2' }


















