05.27 複製js變量問題(面試常考)

內容導讀

前端面試時經常會有一個問題: 複製變量值 。當使用num1的值來初始化num2時,num2中也保存了值2。此後對兩個變量進行任何操作都互不影響。當從一個變量向另一個變量複製引用類型值時,同樣也會將存儲在變量對象中的值複製一份放在為新變量分配的空間裡,但是這個值的副本其實是一個指針,這個指針指向存儲在堆中的一個對象。複製結束後,兩個變量其實引用的是一個對象。因此,改變一個變量就會影響到另一個變量,因為此刻改變的是堆中共同引用的對象。

js變量中存儲了兩種不同數據結構的值 基本類型值 和引用類型值。

基本類型值值的是簡單的數據段,而引用類型值是指那些可能由多個值構成的對象。

前端面試時經常會有一個問題:複製變量值。 這道題考察的就是對基本類型值和引用類型值理解了。

複製基本類型值

var num1 = 2;
var num2 = num1

此時,num1中保存的值是2。當使用num1的值來初始化num2時,num2中也保存了值2。但num2中的2與num1中的2是完全獨立,互不影響的,該值知識num1中2的一個副本。此後對兩個變量進行任何操作都互不影響。

複製引用類型值

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

當從一個變量向另一個變量複製引用類型值時,同樣也會將存儲在變量對象中的值複製一份放在為新變量分配的空間裡,但是這個值的副本其實是一個指針,這個指針指向存儲在堆中的一個對象。複製結束後,兩個變量其實引用的是一個對象。因此,改變一個變量就會影響到另一個變量,因為此刻改變的是堆中共同引用的對象。

值得注意的一點:js中函數傳遞參數的時候都是按值傳遞的,就是像基本類型值複製一樣的操作,即使參數是一個對象,也是按值傳遞,不是按引用傳遞的。


分享到:


相關文章: