原始类型操作的核心在于不可变性和值即本身:值创建后无法修改,所有操作返回新值;变量直接存储数据本身,赋值、比较、传参均为值的拷贝而非引用。

原始类型操作的核心,不在“复制值”这个表象,而在“不可变性”和“值即本身”这两个底层事实。所有看似简单的赋值、比较、传参行为,都由这两点自然推导而来。
不可变性:不是“不能改”,而是“改不了原值”
原始类型的值一旦创建,就无法被修改。所谓 a = "hello"; a += " world",并不是在原字符串上追加,而是创建了一个新字符串 "hello world",再把变量 a 指向它。旧的 "hello" 依然存在(只是无人引用),a 的“变化”本质是重绑定。
- 尝试添加属性会静默失败:
let s = "abc"; s.x = 1; console.log(s.x)→undefined -
const声明原始类型时,既锁住变量绑定,又因值不可变,双重保障不变 - 所有运算(
+、++、toUpperCase()等)返回新值,不改变原值
值即本身:没有地址,只有内容
原始类型变量不持有“指向某处的指针”,它栈中存储的就是数据本身。因此:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 赋值
let b = a是把那个具体的数、布尔、符号等完整拷贝一份,两个变量物理隔离 - 比较
a === b直接比内容是否相等,无需考虑“是不是同一个对象” - 函数参数传入原始类型,形参拿到的是实参值的副本,内部任何赋值都不会影响外部变量
与对象行为的根本分界点
原始类型和对象的差异,不是内存位置(栈/堆)的教条划分,而是行为契约的差异:
- 原始类型:你拿到的就是值,你操作的就是值,你改变的只能是自己绑定的目标
- 对象:你拿到的是钥匙(地址),你操作的是钥匙能打开的房子(堆中实体),多人共用一把钥匙,谁改房子,大家立刻看见
- 所以
typeof null === 'object'是历史包袱,不影响它作为原始类型“不可变、无属性、值即本身”的本质
实战中容易踩坑的边界情况
一些看似违反直觉的现象,其实都源于对“不可变性”的误读:
-
let num = 42; function f(n) { n = 99; } f(num); console.log(num)→ 还是42(形参重赋值,不影响外部) -
let str = "a"; str[0] = "b"; console.log(str)→ 还是"a"(字符串索引赋值无效,因不可变) -
String(123) === "123"和new String(123) === "123"结果不同(前者是原始值,后者是包装对象)

















