JavaScript 是按值傳遞還是按引用傳遞的


今天又回顧了一下js基礎,發現自己很渣,后來看了一下js函數啊的傳遞,那么js到底是按值傳遞還是按引用傳遞呢?(本人新手一枚,如果有什么不正確的地方,還請各位大神指點博正)

答案是肯定的,按值傳遞。

JS所有的函數參數的傳遞都是按值傳遞的,而引用類型傳遞的也是一個值(指向堆內存中的對象的指針副本),這里只說引用類型的傳遞。

先給大家看一個比較常見的,讓人誤解為引用傳遞的。

function changeObj(o){
    o.name = "changeobj";
}
var p = {};
changeObj(p);
console.log(p.name);

看到這里大家肯定會認為這是按引用傳遞的啊,因為在函數內部添加了對象的屬性,在外邊也添加了。那么接下來再看這個例子。

var o = {
    name : 'tt'
}
            
var b = new Object();
b.name = 'b';
o = b;
console.log(o.name);   

 上述代碼先創建了一個對象,然后將其賦值非變量o,接着又用構造器創建了一個對象,並修改其屬性,然后將其復制給變量對象o,然后訪問o的時候name被修改為b了。這里o的引用指向了新對象b;

 再看下面這個例子大家就可以明白了

function quoteFn(obj){
    var o = new Object();
    obj = o;
    obj.name = "tony";
    obj.age = 24;
    obj.sex = "Men";
}

var person = {
    name : "miracle",
    age : 12
}


console.log(person.name);
console.log(person.age);
console.log(person.sex);

在這個例子中先創建了person對象,並設定其name 屬性值為"miracle",age屬性值為 12。接着調用quoteFn()函數,並將person對象的值(這里說的是值,這個值是一個指向person對象的指針)傳遞給了參數obj。

然后在quoteFn函數中穿件了一個局部對象o,並將其復制給了參數obj,然后添加了新的幾個屬性。最后我們打印person.name 發現屬性沒有改變。如果是按引用傳遞,那么person應該指向新的對象啊。

所以綜上所述,JS參數的傳遞是按值傳遞的,引用類型傳遞是一個指針的副本。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM