天天看點

js值傳遞和引用傳遞問題

前言:本文讨論javascript中值傳遞和引用傳遞的問題,部分參考自《JavaScript進階程式設計》

基本資料類型和引用資料類型:

基本資料類型:

ECMScript定義了五種基本資料類型,分别是:Null,Undefined,Number,String,Boolean。這五種資料類型是按值通路的,因為可以操作儲存在變量中的值。

引用資料類型:

引用類型資料包括一切的object,類似Date,Array。引用資料類型的值是儲存在記憶體中的對象,JavaScript是不允許直接通路記憶體中的位置,就是說不能直接操作對象的記憶體空間,是以在操作對象時,實際上是操作對象的引用而不是實際的對象。是以引用類型的值是按引用通路的。

添加屬性:

在引用類型中我們可以添加對象屬性,而在基本資料類型中不可以,雖然不會報錯

var g=new Object();
g.name="haha";
alert(g.name);//haha
           

基本資料類型

var d="people";
d.name="xixi";
alert(d.name);//undefined
           

複制變量值時:

在基本類型中,複制變量實際上是複制了變量的一個副本,在新的變量上修改,也不會互相影響,

var num=5;
var num2=num;//複制了num的一個副本指派給num2   
           

而在引用資料類型中,與基本類型不同的是,複制引用類型的值時,同樣是複制一份放到新的記憶體空間,但是這個值得副本實際上是一個指針,指向堆記憶體中的對象,是以複制完成後,兩個變量引用一個對象,他們任何一個作修改,都會改變另一個變量。

var obj1=new Object();
var obj2=obj1;
obj2.name="2";
alert(obj1.name);//2
           

引用紅寶書的一張圖友善了解:

js值傳遞和引用傳遞問題

在函數中傳遞參數:

ECMScript中所有函數參數都是值傳遞,基本類型值傳遞如基本類型變量複制一樣,而引用資料類型傳遞則和引用類型變量複制一樣,是以就有下面的差別:

基本類型值傳遞

function add(num){
    num+=1;
    return num;
}
var n=3;
var m=add(n);
alert(n);//3
alert(m);//4
           

引用類型值傳遞:

function setName(obj){
    obj.name="xixi";
}
var person=new Object();
setName(person);
alert(person.name);//xixi
           

技術部落格:https://gdmec07140603.github.io/ 歡迎通路

繼續閱讀