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

使用字符串索引JavaScript数组为何会产生混乱结果?

问题原因及解决方案

异常结果的核心原因

你的代码出现混乱结果,完全是因为字符串转义序列使用错误,加上用数组存储键值对的不规范操作导致的,具体分三点:

1. 八进制转义的错误解析

JavaScript中,\后接1-3位数字表示八进制转义序列,比如:

  • \002a会被拆成\002(八进制2,对应Unicode U+0002控制字符)+ 普通字符a,而不是你想要的*(U+002A);
  • \20ac会被拆成\20(八进制16,对应U+0010控制字符)+ 普通字符ac,而不是欧元符号€(U+20AC)。

2. 无效的转义字符

\e不是JavaScript的合法转义序列,所以\e001会被直接当作普通字符串e001输出,不会解析为U+E001的特殊字符。

3. 用数组存储键值对的不规范

虽然JavaScript数组可以添加字符串属性,但数组本质是为数字索引设计的集合,用它存键值对属于不规范用法,建议用普通对象{}代替。


修正后的代码

使用正确的Unicode转义序列+普通对象存储,就能得到你期望的结果:

<!DOCTYPE html>
<head><meta charset="utf-8"></head>
<body></body>

<script>
var glyphNames = ["asterisk","plus","eur","minus","cloud","envelope","pencil","glass","music","search","heart","star","star-empty"]

// 用\uXXXX格式的Unicode转义,或直接写可见字符
var glyphCodes = [
"*", "+", "\u20AC", "\u2212", "\u2601", "\u2709", "\u270F", "\uE001", "\uE002", "\uE003", "\uE005", "\uE006", "\uE007"
]

var glyphs = {} // 用普通对象替代数组
for(var i=0; i<glyphNames.length; i++) {
   glyphs[glyphNames[i]] = glyphCodes[i]
}

console.log(glyphs)
console.log(glyphs["asterisk"]) // 输出 "*"
console.log(glyphs["eur"])       // 输出 "€"
console.log(glyphs["glass"])     // 输出U+E001对应字符
</script>
</html>

额外说明

  • 对于ASCII可见字符(比如*、+),直接写字符比转义序列更直观;
  • 对于Unicode字符(包括控制字符、特殊符号、私有区域字符),统一用\uXXXX四位十六进制转义,是最可靠的写法;
  • 如果非要用八进制转义,必须确保是完整的三位八进制数,比如"\052"对应*,但可读性远不如十六进制转义,不推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:30:59