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
複製代碼
以上爲我的看法,若有問題,歡迎斧正。複製代碼
相關文章
相關標籤/搜索