在 JavaScript 中,对象的键(key)可以是数字,但需要注意以下关键规则:
1. 数字键会被自动转换为字符串
const obj = {
42: "Answer to Everything"
};
console.log(obj[42]); // ✅ 输出 "Answer to Everything"
console.log(obj["42"]); // ✅ 同样输出 "Answer to Everything"(数字键被转为字符串)
2. 数字键在对象中的表现
- 数字键在
for...in
循环中会按升序排列(优先于字符串键):const obj = { "b": "String B", 10: "Number 10", "a": "String A", 2: "Number 2" }; for (const key in obj) { console.log(key); // 输出顺序:2 → 10 → b → a }
- 通过
Object.keys()
获取键时,数字键也会转为字符串:console.log(Object.keys(obj)); // 输出: ["2", "10", "b", "a"]
3. 数字键的限制
- 不能使用点语法(
.
):console.log(obj.42); // ❌ 语法错误(点语法只接受字符串标识符)
- 负数/小数需用方括号(但仍转为字符串):
obj[-1] = "Negative"; obj[3.14] = "Pi"; console.log(obj["-1"]); // ✅ 输出 "Negative" console.log(obj["3.14"]); // ✅ 输出 "Pi"
4. 何时使用其他数据结构?
- 如果需要保留键的原始数据类型(如数字),改用
Map
:const map = new Map(); map.set(42, "Answer"); map.set("42", "Different Answer"); console.log(map.get(42)); // "Answer"(数字类型键) console.log(map.get("42")); // "Different Answer"(字符串类型键)
- 如果需要严格顺序或混合类型键,
Map
是更优选择。
总结
特性 | 对象(Object) | Map |
---|---|---|
键类型 | 数字键自动转字符串 | 支持任意类型(包括数字) |
访问数字键 | obj[42] (方括号) | map.get(42) |
保留键的原始类型 | ❌(数字变字符串) | ✅ |
遍历顺序 | 数字键升序优先 | 插入顺序 |
结论:JavaScript 对象的键支持数字,但会被隐式转为字符串。若需严格数字键或复杂键类型,使用 Map
。