JavaScript中WebGL2RenderingContext API常量对象查找失败原因及可行方案咨询
为什么版本1报错,版本2正常?
问题的核心是JavaScript对象字面量的属性名语法规则,咱们来拆解两种写法的区别:
版本1(执行失败)的原因
在JavaScript的对象字面量中,常规的属性名定义只有两种合法方式:
- 直接写标识符(比如
name: "value"里的name,必须符合标识符规则:不能包含.、空格,不能以数字开头等) - 写字符串字面量(比如
"my-custom-key": "value")
而你版本1里的WebGL2RenderingContext.BYTE是一个表达式(本质是访问WebGL2RenderingContext对象的BYTE属性),直接把表达式放在属性名的位置是不符合语法的——解析器看到.的时候会判定为语法错误,所以抛出了Unexpected token '.'。
简单说:你不能直接把带.的表达式当成属性名写在对象字面量里,解析器不知道该怎么处理这个.符号。
版本2(正常运行)的原理
版本2用的是ES6引入的计算属性名(Computed Property Names)语法,用方括号[]包裹表达式。
当JavaScript看到[WebGL2RenderingContext.BYTE]时,会先执行方括号里的逻辑:
- 先获取
WebGL2RenderingContext.BYTE的实际值(也就是0x1400) - 把这个值作为对象的属性名
所以最终你的WebGlDataTypes对象实际上是这样的(简化版):
const WebGlDataTypes = { 0x1400: "BYTE", 0x1401: "UNSIGNED_BYTE", // ... 其他键值对 };
这正好匹配你的需求:用WebGL常量的数值作为键,映射到对应的符号名称。后面测试代码里用WebGlDataTypes[WebGL2RenderingContext.BYTE]访问时,就是用常量的数值去查找对象的属性,自然能得到正确的结果。
举个简单的例子帮你理解
常规属性 vs 计算属性的差异:
// 常规属性名(标识符) const user = { name: "Alice" }; // 计算属性:用表达式生成属性名 const key = "age"; const user2 = { [key]: 30, // 等价于 "age": 30 [1 + 2]: "three" // 等价于 3: "three" };
内容的提问来源于stack exchange,提问作者Petr Pivonka
相关产品推荐
相关产品推荐

