javascript中原始类型作属性名时一律转为字符串(symbol除外),如42→"42"、true→"true";symbol保持唯一性且不可枚举;该转换是语法层面静态处理,不调用tostring();满足条件的数字键视为数组索引并影响length。

原始类型作为对象属性名时,JavaScript 会自动将其转为字符串(不是数字或 symbol),这是语言底层的统一处理规则,与类型转换机制中的 ToPrimitive、ToNumber 等抽象操作无关,而是直接由属性访问规范决定。
属性名统一转为字符串
无论你用什么原始类型作为键,只要不是 symbol,最终都会被强制转成字符串来存储和查找:
- 数字字面量:obj[42] 等价于 obj["42"]
- 布尔值:obj[true] → obj["true"],obj[false] → obj["false"]
- null:obj[null] → obj["null"]
- undefined:obj[undefined] → obj["undefined"]
- NaN:obj[NaN] → obj["NaN"](注意:NaN !== NaN,但作为属性名时都变成字符串 "NaN")
symbol 是唯一例外
symbol 类型不会被转成字符串,它作为属性名时保持唯一性和不可枚举性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Symbol("a") 和 Symbol("a") 是两个不同 symbol,不会冲突
- Object.keys()、for...in 不会遍历 symbol 属性
- 要获取 symbol 属性,需用 Object.getOwnPropertySymbols()
隐式转换发生在赋值前,不是运行时
这个转换是静态的、语法层面的,在代码解析阶段就完成,不调用 toString() 或 valueOf():
- let obj = { 123: "num" }; → 实际等价于 { "123": "num" }
- obj[1 + 1] = "two"; → 实际设置的是 obj["2"]
- 即使对象有自定义的 toString(),也不会影响该过程
数组索引的特殊性
当数字型属性名满足“非负整数且小于 232−1”时,会被视为数组索引(array index),触发 length 自动更新等行为:
- obj[0]、obj[999] 是索引;obj[-1]、obj[2**32]、obj["1.5"] 则只是普通字符串键
- let arr = []; arr[100] = "x"; console.log(arr.length); // 输出 101
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










