javascript中原始类型在集合中按值相等(samevaluezero)判断,天然去重且无引用共享问题:set自动合并相同值,map支持原始值作键,数组存储独立副本,与对象行为本质不同。

JavaScript 中原始类型在集合(如 Set、Map、数组)里的行为,核心在于“值相等”和“不可变性”——它们不靠引用判断,而是直接比内容。
原始类型在 Set 中自动去重
Set 判断元素是否重复,用的是 SameValueZero 算法(类似 ===,但 0 和 -0 视为相同,NaN 也等于自身)。所以原始值天然适合去重:
-
new Set([1, 1, 'a', 'a', true, true])→Set { 1, 'a', true } -
new Set([0, -0, NaN, NaN])→Set { 0, NaN }(注意:两个NaN被视为同一个) - 每个
Symbol都是唯一值,哪怕描述一样:new Set([Symbol('id'), Symbol('id')])→ 含两个元素
原始类型作 Map 的 key 没问题
Map 允许任意类型作键,原始值完全可以当 key,且比较逻辑和 Set 一致:
-
const m = new Map(); m.set('name', 'Alice'); m.get('name')→ 正确返回'Alice' -
m.set(42, 'answer'); m.has(42)→true,因为数字按值匹配 -
Symbol作 key 可避免属性名冲突:m.set(Symbol('uid'), 1001) - 注意:
null和undefined也能当 key,没有限制
数组里存原始值就是存值本身
数组不是集合类,但它常被当作线性容器使用。原始值在数组中完全独立:
-
let arr = ['a', 1, true]; arr[0] = 'b';→ 只改第一个位置,不影响其他变量 - 赋值或解构时拷贝的是值:
const [x] = arr; x = 'z';不会改变arr[0] - 查找用
indexOf或includes都是值比较:[1, 2, 3].includes(2)→true
和对象类型的关键区别
原始类型在集合中不会出现“引用共享”问题,这是它和对象最直观的差异:
- 对象放进
Set或作Mapkey,每次新对象都算不同项:new Set([{a:1}, {a:1}])→ 长度为 2 - 原始值则只看内容:
new Set(['hello', 'hello'])→ 长度为 1 - 想让对象有类似原始值的行为?得自己实现
toString()或用JSON.stringify生成唯一键,但这不是语言原生支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











