eval()遇含小数对象键触发Unexpected number错误原因排查
为什么对象键含小数会触发「Unexpected number」错误?
这个错误本质是JavaScript的语法解析规则导致的,咱们结合你的业务场景一步步拆解:
核心原因:对象属性的访问语法限制
JavaScript里用点语法(比如obj.key)访问对象属性时,属性名必须符合「标识符命名规则」——只能以字母、下划线_或美元符号$开头,后续可跟字母、数字、下划线或美元符号。
但如果属性名是包含小数点的字符串(比如"62.5th"),点语法就彻底失效了:解析器看到obj.62.5th时,会先把62识别为数字,后面的.会被当成是访问数字属性的语法(比如123.toString()),但紧接着的5th完全不符合语法逻辑,直接触发「Unexpected number」的语法错误。对应你的业务场景
前端传入的62.5th这类百分位数据,封装成对象后对应的键是类似"62.5th"的字符串。如果你的映射处理代码里误用了点语法访问这类键,就会触发报错。
举个错误示例:
// 假设后端返回的对象 const percentileData = { "5th": 100, "15th": 200, "62.5th": 300 }; // 错误写法:用点语法访问带小数点的键 console.log(percentileData.62.5th); // 直接抛出「Unexpected number」错误
而正确的处理方式是用方括号语法访问这类特殊键:
// 正确写法:用方括号包裹属性名字符串 console.log(percentileData["62.5th"]); // 输出300 // 如果是遍历映射,用方括号访问也完全没问题 Object.keys(percentileData).forEach(key => { console.log(`百分位${key}的值是${percentileData[key]}`); });
- 额外说明:纯数字键为什么没问题?
比如obj[62]或obj["62"]是合法的,因为解析器会把纯数字键识别为数字类型属性名;但像"62.5th"这种混合了小数点和字母的字符串,完全不符合标识符规则,点语法必然报错。
内容的提问来源于stack exchange,提问作者strumpy_strudel
相关产品推荐
相关产品推荐

