JavaScript原始类型按值传递且不可变:赋值复制独立副本,修改实为重新赋值,无共享内存问题,函数传参不影响外部变量。

JavaScript 中的原始类型(如 string、number、boolean、undefined、null、symbol 和 bigint)在赋值时是按值传递的,且其值本身不可被修改——这就是“不可变性”。这种特性直接影响赋值、函数传参和比较等行为。
赋值操作不共享内存,而是复制值
当你把一个原始类型的值赋给另一个变量时,JS 会创建该值的一个**完全独立的副本**,两个变量互不影响:
- let a = 42;
- let b = a; → 此时 b 得到的是 42 的一份拷贝,不是对 a 的引用
- a = 99; → 只改变 a,b 仍是 42
看似“修改”实为重新赋值
原始类型没有可变的方法(比如 str.push() 会报错),所有字符串操作(如 toUpperCase()、slice())都返回新字符串,原值不变:
- let s = "hello";
- let t = s.toUpperCase(); → s 还是 "hello",t 是 "HELLO"
- s += " world"; → 实际是 s = s + " world",生成新字符串并让 s 指向它
与对象类型的关键区别
对比对象(如数组、对象字面量),原始类型不会出现“意外共享”问题:
立即学习“Java免费学习笔记(深入)”;
- let obj1 = { x: 1 }; let obj2 = obj1; → obj2 和 obj1 指向同一内存地址
- obj1.x = 99; → obj2.x 也变成 99
- 而原始类型永远不会有这种联动,因为根本不存在“指向同一份数据”的概念
影响函数参数传递的行为
函数接收原始类型参数时,形参只是实参值的副本:
- function change(n) { n = n * 2; }
- let x = 5; change(x); → x 仍是 5,函数内对 n 的任何赋值都不影响外部
- 这和传入对象不同:若传入对象,函数内部修改其属性会影响原对象(因传递的是引用)










