2021-08-06

用大白话一次说清JS中传址(call by value)与传址(call by reference)的区别

  • 简单数据类型(String、Number、Boolean、null、undefined)属于传值
  • 引用类型(Object、Array、Function)为传引用

1、传值(call by value)

当数据为简单数据类型(如String、Number、Boolean、null、undefined),那么即为赋值操作

let a = 10
let b = 10

console.log(a === b) //true

在这里插入图片描述

a更新后不会影响b

let a = 10
let b = a
a = 20

console.log(a === b) //false

在这里插入图片描述

2、传址

当数据为引用类型(Array、Object、function),那么即为赋址操作

var obj1 = { v1: 1 };
var obj2 = { v1: 1 };

console.log( obj1 === obj2 );  // false

在这里插入图片描述
因为两者的存储“位置”并不相同(在这里先不讨论堆和栈,因为新手听到这个会懵圈)。在比较引用数据类型时,比较的是存储“位置”,而非值。

let obj1 = { v1: 1 };
let obj2 = obj1;

obj1.v1 = 0;

console.log( obj2.v1 );  // 0

obj2.v2 = 2;

console.log( obj1.v2 );  // 2
console.log( obj1 === obj2 );  // true

当我们修改任意引用类型数据的属性值时,另一边的属性值也会随着更改,这是因为两边变量指向相同的储存“位置”,并没有新的引用类型被复制出来。

注意例外

pass by sharing => 当数据被传入function当参数时且数据被重新赋址时,数据是不会被影响的。

let obj1 = { v1: 1 };

function change(e){
e = {v1:100};
console.log(obj1)   //{ v1: 1 }
}
change(obj1)
console.log(obj1)   //{ v1: 1 }

如果改成一下方式,则可改变数据值

let obj1 = { v1: 1 };

function change(e){
console.log(obj1)   // { v1: 1 }
e.v1=100;
}

change(obj1)
console.log(obj1)  //{ v1: 100 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值