使用字符串索引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
相关产品推荐
相关产品推荐

