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

今天又回顧了一下js基礎,發現本身很渣,後來看了一下js函數啊的傳遞,那麼js究竟是按值傳遞仍是按引用傳遞呢?(本人新手一枚,若是有什麼不正確的地方,還請各位大神指點博正)javascript

答案是確定的,按值傳遞。java

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;blog

 再看下面這個例子你們就能夠明白了ip

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應該指向新的對象啊。io

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

相關文章
相關標籤/搜索