JS有5種簡單數(shù)據(jù)類型(也稱基本數(shù)據(jù)類型):undefined、null吆视、Boolean鲸沮、Number和String纫雁。還有兩種復雜數(shù)據(jù)類型——symbol(這里不做多介紹)和Object逞力,對象本質(zhì)上是由一組無序的名值對組成的曙寡,ECMAScring不支持任何創(chuàng)建自定義類型的機制,而所有值最終都將是上述7種數(shù)據(jù)類型之一寇荧。
數(shù)據(jù)類型的相互轉(zhuǎn)換
1.任意數(shù)據(jù)類型轉(zhuǎn)字符串
String(x)
String(1)//"1"
String(true)//"true"
String(null)//"null"
String(undefined)//"undefined"
String({})//"[Object Object]"
toString()
(1).toString() //"1"
true.toString() //"true"
null.toString() //Uncaught TypeError: Cannot read property 'toString' of null
// at <anonymous>:1:6
undefined.toString() //Uncaught TypeError: Cannot read property 'toString' of undefined
//at <anonymous>:1:11
{}.toString() //Uncaught SyntaxError: Unexpected token .
({}).toString() //"[object Object]"
老司機用法:x+''
1+'' // "1"
true+'' // 'true'
null+'' // 'null'
undefined+'' // 'undefined'
{}+'' // 0
var o = {}
o+ '' //{object Object}
2.任意數(shù)據(jù)類型轉(zhuǎn)數(shù)字
1.Number(x)
2.parselnt(x举庶,10)
MDN
3.parseFloat(x)
MDN
4.x-0
5.+x
3.任意數(shù)據(jù)類型轉(zhuǎn)布爾值
1.Boolean(x)
2.!!x
4.五個falsy值
0 NaN '' null undefined .
5.內(nèi)存圖
- 你買一個 8G 的內(nèi)存條
- 操作系統(tǒng)開機即占用 512MB
- Chrome 打開即占用 1G 內(nèi)存
- Chrome 各每個網(wǎng)頁分配一定數(shù)量的內(nèi)存
- 這些內(nèi)存要分給頁面渲染器、網(wǎng)絡模塊砚亭、瀏覽器外殼和 JS 引擎(V8引擎)
- JS 引擎將內(nèi)存分為代碼區(qū)和數(shù)據(jù)區(qū)
- 我們只研究數(shù)據(jù)區(qū)
*數(shù)據(jù)區(qū)分為 Stack(棧內(nèi)存) 和 Heap(堆內(nèi)存) - 簡單類型的數(shù)據(jù)直接存在 Stack 里
- 復雜類型的數(shù)據(jù)是把 Heap 地址存在 Stack 里
遇到問題就畫圖灯变,不要分析殴玛。
如果將復雜數(shù)據(jù)類型存放在棧內(nèi)存里面捅膘,那么向其中添加數(shù)據(jù)就很麻煩、一些數(shù)據(jù)就需要向后面移動滚粟。只需要在棧內(nèi)存中給代表復雜數(shù)據(jù)類型(對象)的變量存放一個地址(沒有指針寻仗,是引用)指向堆內(nèi)存中的數(shù)據(jù)。一個變量等于另一個復雜數(shù)據(jù)類型凡壤,就把地址復制給它署尤。
所有的變量和對象都是引用關系。
4個常見的面試題
var a = 1
var b = a
b = 2
請問 a 顯示是幾亚侠? //1
var a = {name: 'a'}
var b = a
b = {name: 'b'}
請問現(xiàn)在 a.name 是多少曹体?//'a'
var a = {name: 'a'}
var b = a
b.name = 'b'
請問現(xiàn)在 a.name 是多少?//'b'
var a = {name: 'a'}
var b = a
b = null
請問現(xiàn)在 a 是什么硝烂?//{name: 'a'}
垃圾回收機制
GC 垃圾回收 如果一個對象沒有被引用箕别,那么它就是垃圾,將會被回收滞谢。
引用包括事件觸發(fā)引用串稀,如果一個函數(shù)被頁面上的事件引用了,也不會算作垃圾被回收狮杨。
解決辦法:將事件賦值null母截,就表示不再引用。
IE6 BUG 無法正常的在頁面關閉時橄教,將沒有人引用的垃圾正常的清除清寇。設置window.onunload事件喘漏,將所有的事件都設置為null。
內(nèi)存泄露:表示該被標記為垃圾的數(shù)據(jù)沒有被標記华烟,內(nèi)存就會被永久的占用陷遮。除非把整個瀏覽器關閉,否則瀏覽器就會吃很多的內(nèi)存垦江,無法再分配新的內(nèi)存用于存儲數(shù)據(jù)帽馋。*
深復制是什么鬼
var b = a
b = 2 //這個時候改變 b
a 完全不受 b 的影響
那么我們就說這是一個深復制
對于簡單類型的數(shù)據(jù)來說,賦值就是深拷貝比吭。
對于復雜類型的數(shù)據(jù)(對象)來說绽族,才要區(qū)分淺拷貝和深拷貝。
這是一個淺拷貝的例子
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
因為我們對 b 操作后衩藤,a 也變了
什么是深拷貝了吧慢,就是對 Heap 內(nèi)存進行完全的拷貝。
var a = {name: 'frank'}
var b = deepClone(a) // deepClone 還不知道怎么實現(xiàn)
b.name = 'b'
a.name === 'a' // true
對于基本類型變量赏表,簡單的賦值就是深拷貝检诗。改變一個變量,不影響賦值的變量瓢剿,兩者互不干擾逢慌。對于深淺拷貝,一般只討論復雜數(shù)據(jù)類型间狂。
復雜類型變量攻泼,a等于b,a改變導致b也會改變鉴象,這就是淺拷貝忙菠。因為只是將stack里面的地址復制了一份而已。復雜數(shù)據(jù)類型的深拷貝纺弊,會拷貝堆內(nèi)存里面的數(shù)據(jù)牛欢,包括數(shù)據(jù)內(nèi)的引用,將不再引用同一個地址淆游,而是引用新拷貝的數(shù)據(jù)的地址傍睹。