当前位置 博文首页 > 纸飞机博客:参数值传递

    纸飞机博客:参数值传递

    作者:[db:作者] 时间:2021-09-07 10:12

    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}

    cs
    下一篇:没有了