JavaScript 原始值 / 引用值的理解

典型案例

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中所有函数的参数都是按值传递的。这意味函数外部的值会被复制到函数内部的参数中,就想一个变量复制到另一个变量一样。

根本原因:变量的复制

原始值 的复制

原始值
原始值类的变量:包含undefinednullbooleanstringnumberSymbol六种。是按值访问的。

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]);  

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值