You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用常量定义JavaScript对象出现异常行为的原因咨询

JavaScript对象定义差异的原因解释

先看你提供的代码:

const PORTRAIT = 'PRT';
const LANDSCAPE = 'LND';
const SQUARE = 'SQ';

const good_image_ratios = {}
good_image_ratios[LANDSCAPE] = '16_9_';
good_image_ratios[PORTRAIT] = '3_4_';
good_image_ratios[SQUARE] = '1_1_';

const wrong_image_ratios = { LANDSCAPE: '16_9_', PORTRAIT: '3_4_', SQUARE : '1_1_'  }

console.log(good_image_ratios);
console.log(wrong_image_ratios);

console.log(good_image_ratios[LANDSCAPE]);
console.log(wrong_image_ratios[LANDSCAPE]);

控制台输出:

{ LND: '16_9_', PRT: '3_4_', SQ: '1_1_' }
{ LANDSCAPE: '16_9_', PORTRAIT: '3_4_', SQUARE: '1_1_' }
16_9_
undefined

差异原因

这是JavaScript对象键名的两种写法规则导致的:

  • 第一种写法(good_image_ratios):用方括号[]赋值时,方括号内的内容会被当作表达式计算。这里的LANDSCAPE是变量,会取它的实际值'LND'作为对象的键名,最终对象的键是'LND'、'PRT'、'SQ'。
  • 第二种写法(wrong_image_ratios):普通对象字面量里的LANDSCAPE没有被方括号包裹,它会被直接当作字符串字面量作为键名。也就是说这个对象的键是字符串'LANDSCAPE'、'PORTRAIT'、'SQUARE',和你定义的变量完全无关。

所以当你用wrong_image_ratios[LANDSCAPE]访问时,实际上是用变量LANDSCAPE的值'LND'作为键去查找,但这个对象里根本没有'LND'这个键,自然返回undefined。

如果要让第二种写法和第一种效果一致,需要用ES6的计算属性名语法,把键名用方括号包裹:

const correct_image_ratios = { 
  [LANDSCAPE]: '16_9_', 
  [PORTRAIT]: '3_4_', 
  [SQUARE] : '1_1_'  
}

这样定义的对象,键名就是变量对应的值,和good_image_ratios完全一致。

内容的提问来源于stack exchange,提问作者Nicola Lepetit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:24:54