参数值传递

Posted 纸 飞机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了参数值传递相关的知识,希望对你有一定的参考价值。

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}

以上是关于参数值传递的主要内容,如果未能解决你的问题,请参考以下文章

在C代码中将结构体变量作为参数传递效率忒低

3.给只读动画添加事件

如何将浮点矩阵作为 2D 纹理传递给片段着色器?

如何将数据从一个活动传递到android中的另一个活动片段? [复制]

Method

如何将活动值传递给片段[重复]