JS 的形参与实参

Javascript的参数分为实参形参两种类型:

实参:从字面意义咱们能够理解为“实际存在的参数”,是在函数调用时传给函数的变量,该变量在函数执行时必须存在。实参能够为变量、常量、函数、表达式等。
形参:从字面意义咱们能够理解为“形式上存在的参数”,由此咱们能够看出它并非真实存在的参数,又称为虚拟变量。它在函数定义时使用,做用为接收函数调用时的实参。
在JavaScript中实参形参数量并不须要像JAVA同样必须在数量上严格保持一致,具备很大的灵活性。以下:java

function test(str1, str2, str3) {
        // ......
    }
    test();                             // str1: undefined, str2: undefined, str3: undefined
    test('hello');                      // str1: 'hello', str2: undefined, str3: undefined
    test('hello', 'world');             // str1: 'hello', str2: 'world', str3: undefined
    test('hello', 'world', '!');        // str1: 'hello', str2: 'world', str3: '!'
复制代码

在JavaScript代码运行过程当中,形参的做用为接收实参,它们两个分别位于不一样的内存地址中,大体能够分为两种状况:react

  1. 实参为原始值。当实参原始值时,此时形参实参的拷贝。所以,函数体内形参值的改变并不会影响实参
function test(str) {
        str = 'chinese';
        return str;
    }
    const str1 = 'china';
    const str2 = test(str1);
    console.log(str1);      // china
    console.log(str2);      // chinese
复制代码
  1. 实参为引用值。当实参引用值时,此时形参实参内存地址的拷贝。所以,函数体内形参值的变化在必定状况下将会影响实参
function test(obj) {
        // 形参obj的值实际上为实参obj的内存引用,及形参与实参同时指向同一个内存地址。
        obj.name = 'typeScript';    // 此时改变的为形参与实参同时指向的那个内存地址中的值
                                    // 因此此时也致使实参的name属性发生了变化
        obj = {                     // 此时对形参obj进行从新赋值,给予了它一个新的内存地址
            name: 'react',          // 今后以后的形参将于实参彻底解绑,二者以前再也不存在联系
            star: 13000,
        }
        obj.star = 20000;           // 因此这里仅仅是改变了形参的star属性
        return obj;
    }
    const obj1 = {
        name: 'javaScript',
        star: 100000,
    }
    const obj2 = test(obj1);
    console.log(obj1);      // name: 'typeScript', star: 100000
    console.log(obj2);      // name: 'react', star: 20000
复制代码
以上为我的看法,若有问题,欢迎斧正。复制代码
相关文章
相关标签/搜索