美文网首页js css html
JS 改变形参导致实参改变

JS 改变形参导致实参改变

作者: 没名字的某某人 | 来源:发表于2021-01-22 11:55 被阅读0次

今天碰到一个有意思的问题,在一个函数中对形参做了改变之后,导致实参的值发生了变化,原先并没有注意,今天偶然触发(所以代码要规范啊.......),直接上代码。

代码

demo1

function test1(param){
  param = 3;
}
var x = 1;
test(x);
console.log(x); // x = 1 

demo2

function test2(param){
  param.name = "aven";
}
var persion = {
    name:"ake",
    age:18
};

test2(persion);
console.log(persion); //{name:"aven",age:18}

问题

一样的套路,但是结果不同,demo1没有改变传入的实参变量,demo2改变了传入的实参变量。

差别就在于demo1中,参数为简单数据类型(null,undefined,boolean,number,string),demo2中为复杂数据类型(object,typeof([]) === 'object')。

解决

那么要想对复杂数据类型进行传参后的处理应该怎么办?

简单实现一个deepClone

function deepClone(obj) {
    const tempObj = {};
    let keys = Object.keys(obj);
    keys.forEach(key => {
        if (typeof obj[key] === 'object') {
            if (Array.isArray(obj[key])) {
                tempObj[key] = [].concat(obj[key]);
            } else {
                tempObj[key] = deepClone(obj[key])
            }
        } else {
            tempObj[key] = obj[key];
        }
    });
    return tempObj;
}

创建一个新Object,当原Object的key所对应value为简单数据类型时,可以直接赋值给新Object,当原Object的key所对应value为复杂数据类型时,要对这个value递归使用deepClone方法,不可以直接赋值给新Object。

相关文章

  • JS 改变形参导致实参改变

    今天碰到一个有意思的问题,在一个函数中对形参做了改变之后,导致实参的值发生了变化,原先并没有注意,今天偶然触发(所...

  • JS 改变形参导致实参改变

    今天碰到一个有意思的问题,在一个函数中对形参做了改变之后,导致实参的值发生了变化,原先并没有注意,今天偶然触发(所...

  • c++中值传递引用传递的定义

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形...

  • 函数与数组

    当函数的形参为基本数据类型时,是值传递,函数内部改变形参,外部实参的值不变 当函数的形参为数组时,是内存地址的传递...

  • C语言形参与实参

    C语言中形参与实参的关系是:形参是实参的值副本,无论参数的类型是什么,传递到子函数的形参只是实参的值。在子函数里改...

  • js 打印形参 & 实参

    概念 形参:定义函数时传入的参数(需要传入的参数);实参:调用函数时传入的参数(实际传入的参数); 打印 形参 实参

  • 19-3-18 python函数传参方式

    python函数传参跟js很像: 直接传参方式: 形参实参按顺序一一对应,跟js一样 指定传参 参数顺序不用一一对...

  • JavaScript 05 函数

    js函数的概念和作用,js函数的定义,js函数的调用,js事件驱动的概念,js函数的实参和形参,js的作用域,js...

  • 函数闭包

    定义形式: 传入实参时实参可多于形参也可少于形参 实参列表: Arguments

  • 前端学习日记-js函数的定义和调用(个人学习笔记,如果错了请指正

    1.参数 js中分为形参和实参,形参是函数中的变量,实参是一个实际的数,是运行时函数调用的参数。 一、函数定义(f...

网友评论

    本文标题:JS 改变形参导致实参改变

    本文链接:https://www.haomeiwen.com/subject/hstkzktx.html