0
点赞
收藏
分享

微信扫一扫

参数值传递


ECMAScript中函数所有参数传递是按值传递的,不是按引用传递。

按值传递的意思:把函数外部的值复制给 函数内部的另一个参数,如同把值从一个 变量复制到另一个变量一样。当传递基本 类型的值时,被传递的值复制给形参,当 传递引用类型的值时,会把这个值在内存 中的地址复制一份给形参(可以理解为传递 的是引用的副本,不是真正的引用)。

栈堆和变量:基本数据类型的值存在栈 中。引用数据类型的对象存在堆中,而在 栈中保存的是对象在堆中的引用地址,然 后 通 过 这 个 地 址 查 找 到 保 存 在 堆 中 的 对 象,因为JS不允许直接访问堆内存。

变量的复制

参数值传递_引用类型

基本类型的复制

let a = 1

let b = a

//栈中创建一个新值b,将a的值复制一份给b,a和b是独立的,a重新赋值后b不变。
a = 2

console.log(a) //2
console.log(b) //1

引用类型的复制

let obj1 = { name: 'a' }

let obj2 = objl //obj1的引用地址复制了一份给了新值obj2, objl和obj2指向同一个堆,改变其中一个会影响另一个。

obj2.name = 'b'

console.log(objl)///name: "b"}
console.Iog(obj2)///name: "b"}


//------------------------

let objl = { name : 'a' }

let obj2 = objl

obj2 = { name : 'b' }

//新建一个对象赋值给objl, 在堆中重新分配空间, 栈中为新地址 ,obj2不再指向objl。重新赋值数值或字符串给obj2也同理。

console.log(objl) //{name: "a"}
console.Iog(obj2) //{name: "b"}

函数的参数传递 

同变量的复制机制一模一样,可以看成将一个实参变量复制到另一个形参变量(一个 函数临时局部变量,函数执行完会立即销毁)中。

基本类型的参数传递

let vl = 1

function fn(v2) {
v2 = 2;
console.log(v2);//2
}

fn(vl);

console.log(vl)//1 vl和v2是独立的,形参值的变化不会影响实参

引用类型的参数传递

let objl = {
value: 1
}

function fn(obj2) {//objl的引用地址复制了一份传给形参obj2, objl和obj2指向同一个堆
obj2.value = 2;
console.log(obj2.value);//2
}
fn(objl);

console.log(objl.value)//2


--------------------------


let objl = {
value: 1
}
function fn(obj2) {
obj2.value = 2
obj2 = {//obj2重新赋值,指向新创建的对象
value: 3
}
console.Iog(obj2);//{value: 3}
)
fn(objl);

console.log(objl)//{value:2}

参数值传递_按值传递_02

参数值传递_参数传递_03


举报

相关推荐

0 条评论