JavaScript 的數(shù)據(jù)類型拟糕,共有七種吩蔑。
6種為基本類型(Number,String坑雅,Boolean实檀,Null惶洲,Undefined,Symbol)膳犹。
這六種數(shù)據(jù)類型是存儲在棧 (Stack)中的恬吕,一行一行存儲。
最后一種復雜數(shù)據(jù)類型Object是存儲在堆(Heap)中的须床,通過引用的方式賦值給變量铐料。
瀏覽器的JS引擎在得到內(nèi)存后會劃分為兩個區(qū)域代碼區(qū)和數(shù)據(jù)區(qū),在數(shù)據(jù)區(qū)劃分為棧內(nèi)存(Stack)和堆內(nèi)存(Heap)
簡單類型的數(shù)據(jù)之間存在Stack中豺旬,復雜類型的數(shù)據(jù)是把 Heap 地址存在 Stack 里钠惩。
第一題
var a = 1
var b = a
b = 2
請問 a 顯示是幾?
此時執(zhí)行b=2直接將 2 的值放在 b 的stack中,如:
所以b的改變并沒有影響到a族阅,a的結(jié)果還是1篓跛。
第二題
var a = {name: 'a'}
var b = a
b.name = 'b'
請問現(xiàn)在 a.name 是多少?
當運行至var b = a時a和b的指向相同耘分,此時運行b.name = 'b'举塔,更改了heap中地址1中的信息绑警,如圖所示求泰。所以這個時候a.name的結(jié)果是{name: 'b'}央渣。
淺拷貝和深拷貝
var a = 1
var b = a
b = 2
上邊的代碼中當對b改變了,a完全不受影響渴频,即為深拷貝芽丹。
對于簡單類型中,賦值就是深拷貝卜朗。
對于復雜類型(對象)拔第,就有深拷貝和淺拷貝一說。因為復雜類型存在引用關(guān)系场钉,所以在更改其中一個對象時蚊俺,兩者的指向還是相同的,即存在一個發(fā)生變化逛万,另個也一起變化泳猬。
淺拷貝則是簡單的值的傳遞,a值傳遞給b宇植,b值改動時得封,a值也會改動,以對象為例:
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
GC垃圾回收機制
如果一個對象沒有被引用指郁,就是垃圾忙上,將被回收。
var fn = function(){}
document.body.onclick = fn
fn = null
document.body.onclick = null
任意類型轉(zhuǎn)字符串
String(x)
x.toString()
x + ''
任意類型轉(zhuǎn)布爾
Boolean(x)
!!x
如果 JavaScript 預期某個位置應該是布爾值闲坎,會將該位置上現(xiàn)有的值自動轉(zhuǎn)為布爾值疫粥。轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為false,其他值都視為true腰懂。
undefined
null
false
0
NaN
""或''(空字符串)