值传递
// 1.赋值
let a = 1;
let b = a;
// 值传递,只在基本类型之间存在,数值,字符串
console.log("a=%d ,b=%d", a, b);
// 输出 a=1,b=1
// 更新a
// 输出 a=2,b=1
a = 2;
console.log("a=%d ,b=%d", a, b);
其中%d为占位符
引用传递
适用于引用类型,对象,数组
let obj1 = {
a: 1,
b: 2,
};
console.log("obj1=%o", obj1);
// 输出 obj1={a:1,b:2}
let obj2 = obj1;
console.log("obj2=%o", obj2);
// 输出obj2={a:1,b:2}
console.log(obj1 === obj2);
// 输出 true
// 更新obj1
// 对象使用点语法来访问内部成员
obj1.a = 10;
console.log("obj1=%o", obj1);
// 输出 obj1={a:10,b:2}
console.log("obj2=%o", obj2);
// 输出 obj2={a:10,b:2}
obj2跟着发生改变是因为引用传递没有创造新的变量,只是给当前的变量设了一个别名,用作引用
传参
永远是值传递
const f1 = (x) => (x = 10);
let m = 5;
// m:入参
f1(m);
console.log("m=%d", m);
//输出 5
观察a的变化
const f(2) =(x) => (x.a = 10);
let o = { a : 1,b : 2 };
f2(o);
console.log("o.a = ", o.a);
// 输出 o.a= 10
a值并没有发生改变
const f2 = (x) => (x = { });
let o = { a: 1, b: 2 };
f2(o);
console.log("0.a=", o.a);
// 输出 0.a=1
a值发生改变
深拷贝:值传选
浅拷贝:引用传递