JavaScript中原始类型按值传递即复制数据本身,函数内修改不影响外部变量;因栈中独立存储且不可变,需通过返回值或直接操作DOM属性实现更新。

JavaScript 中原始类型值的按值传递,本质是复制数据本身,而非地址或引用。函数内部对参数的任何修改,都不会影响外部变量——这不是限制,而是设计使然。
原始类型传参就是复制一份数据
当你把 number、string、boolean、null、undefined、symbol 或 bigint 传入函数时,JS 在栈内存中为形参新开一块空间,把实参的值原样拷贝过去。两个变量互不关联,就像两张同一底片洗出的照片。
- let a = 42; function f(n) { n = 100; } f(a); → a 仍是 42
- n += 1、n.toUpperCase()、n.toString() 等操作,都只作用于副本
- 所有原始类型在栈中物理独立存储,没有指针、不共享、不联动
为什么改不了外面的值?不是 bug,是机制
很多人误以为“函数里改了参数,外部应该跟着变”,结果发现没效果。这恰恰说明机制在正常工作——原始类型不可变,且传参即拷贝。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 错误写法:function double(x) { x *= 2; } double(num); // num 不变
- ✅ 正确写法:function double(x) { return x * 2; } num = double(num);
- 若需同步更新多个值,可返回对象或数组:return { a: x * 2, b: y + 1 };
和对象传参的根本区别:传的是什么
JS 所有参数都是按值传递,但“值”的含义不同:
立即学习“Java免费学习笔记(深入)”;
- 原始类型传的是“数据本身”(如 42、"hello")
- 对象传的是“堆内存地址”(如 0x1a2b3c),这个地址被复制了一份
- 所以 obj.x = 99 能影响外部,但 obj = {} 却不能——后者只是重写了局部地址
DOM 场景中的典型误用与正解
处理输入框限制长度时,常见错误是把 input.value 赋给局部变量再修改:
- ❌ let x = input.value; x = x.slice(0, 10); // 无效,x 只是字符串副本
- ✅ input.value = input.value.slice(0, 10); // 直接操作 DOM 属性才生效
- 关键点:value 是原始类型(string),必须绕过局部变量,直接写回 DOM

















