JS 的形参与实参

5,910 阅读2分钟

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

实参:从字面意义我们可以理解为“实际存在的参数”,是在函数调用时传给函数的变量,该变量在函数执行时必须存在。实参可以为变量、常量、函数、表达式等。
形参:从字面意义我们可以理解为“形式上存在的参数”,由此我们可以看出它并不是真实存在的参数,又称为虚拟变量。它在函数定义时使用,作用为接收函数调用时的实参。
在JavaScript中实参形参数量并不需要像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代码运行过程中,形参的作用为接收实参,它们两个分别位于不同的内存地址中,大致可以分为两种情况:

  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
以上为个人见解,如有问题,欢迎斧正。