交换两个变量的值
典型案例
function exchange(a,b){
let c = a;
a = b;
b = c;
console.log('函数内部a,b:',a,b);
}
let a = 3,b = 4;
exchange(a,b);
console.log('函数外部a,b:',a,b);
输出结果:
造成以上结果的原因:ECMAScript中所有函数的参数都是按值传递的。这意味函数外部的值会被复制到函数内部的参数中,就想一个变量复制到另一个变量一样。
根本原因:变量的复制
原始值 的复制
原始值
原始值类的变量:包含undefined,null,boolean,string,number和 Symbol六种。是按值访问的。
let num1 = 5;
let num2 = num1;
num1++;
console.log('num2:',num2);
原始值 在 复制 过程中,重新开辟空间存值,num1 与 num2 完全独立,互不干扰。
引用值 的复制
本质是复制指向堆内存对象的指针。
引用值
引用值时保存在内存中的对象。JavaScript不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。
let num1 = new Object();
num1.age= 18;
let num2 = num1;
num1.age++;
console.log('num2.age:',num2.age);
到此,就能理解典型案例为什么外部交换数值失败了。
交换两个变量的正确方法
JavaScript没有按引用传值,所以需要变相的将两个变量存在非原始数据类型中再进行操作。
function exchange(a){
let c = a[0];
a[0] = a[1];
a[1] = c;
console.log('函数内:',a[0],a[1]);
}
let a = [3,4];
exchange(a);
console.log('函数外部:',a[0],a[1]);
结果: