在日常開發中常有這樣乙個需求
初始化多個變數為預設值,如下
let defaultval =0;
var numone=defaultval;
var numtwo=defaultval;
numone+=2;
numtwo+=5;
console.log(numone,numtwo)//結果2,5
對於上面這個**,兩個變數在分別處理後互不影響
因為defaultval在js儲存方式中屬於基本型別(boolean,number,string,undefined,null,symbol)
從乙個變數向乙個變數複製時,會在棧中建立乙個新值,然後把值複製到為新變數分配的位置上,這也就是預設值賦值給兩個新變數後再修改兩個變數互不影響的原因。
也就是說在賦值後棧中有了三個變數並且都有自己的值
而在我們需求變了以後,修改**如下
let defaultval =[0,0,0,0,0];
let defaultuser=;
var numone=defaultval;
var numtwo=defaultval;
numone[0]=6;
console.log(numone,numtwo)
//結果[6,0,0,0,0],[6,0,0,0,0]
var codemonkey=defaultuser;
var promanager=defaultuser;
promanager.name='mr.steve';
console.log(codemonkey,promanager)
//結果也都是
如**所示,定義兩個不同變數後將預設值賦給它們後再處理將會影響對方
因為defaultval、defaultuser在js儲存方式中屬於引用型別(物件object,陣列array,函式function)
解析:引用資料型別值指儲存在堆記憶體中的物件。也就是,變數中儲存的實際上的只是乙個指標,這個指標指向記憶體中的另乙個位置,該位置儲存著物件。訪問方式是按引用訪問,也是由此它們中修改任意乙個變數都是在修改堆中同一物件,所以即使是在賦值給不同變數後修改對方仍然會相互影響,如下圖
在實際開發中我們難免會有需要用到引用型別的值來做預設賦值。
那麼怎麼去賦值才可以做到像基本型別那樣賦值在操作相互不影響?
簡單易懂的處理方式就是:
方法一:(注意這是便於理解的方法!,實際開發可用第二種方法)
let defaultval =[0,0,0,0,0];
let defaultuser=;
var numone=copyarr(defaultval);
var numtwo=copyarr(defaultval);
numone[0]=6;
function copyarr(oldarr)
return newarr
}
方法二:'...'在物件前,你就理解為遍歷了這個物件的每一項然後返回。注意陣列一定要括起來,物件要{}括起來,因為返回的是每一項的子項並非乙個新的物件。
let defaultval =[0,0,0,0,0];
let defaultuser=;
var numone=[...defaultval];
var numtwo=[...defaultval];
numone[0]=6;
var codemonkey=[...defaultuser];
var promanager=[...defaultuser];
promanager.name='mr.steve';
JS堆疊與拷貝
一.堆疊的定義 結論 後進先出 last in first out 簡稱為lifo線性表。棧的應用有 數制轉換,語法詞法分析,表示式求值等 2.佇列 queue 也是一種運算受限的線性表,它的運算限制與棧不同,是兩頭都有限制,插入只能在表的一端進行 只進不出 而刪除只能在表的另一端進行 只出不進 允...
JS 倒計時功能 堆疊溢位問題
今天寫前端乙個倒計時功能,我參考了網上的一段 function countdown surplustime,fromtime function checktime i return i 在倒數第二行 var st new date fromtime new date firefox報 too muc...
JS的堆 棧,資料賦值
一 堆 heap 和棧 stack 棧 stack 會自動分配記憶體空間,會自動釋放。堆 heap 動態分配的記憶體,大小不定也不會自動釋放 二 資料型別 1 基本型別 簡單的資料段,存放在棧裡面,佔固定大小的空間 基本型別有 undefined null boolean number 和strin...