1.JS 里的數(shù)據(jù)
1.1.轉(zhuǎn)化為字符串(console.log就是這個(gè)原理)
1.1.1.tostring
null和undefined沒有tostring這個(gè)API碰辅。所以也無法轉(zhuǎn)化類型篙贸。API就是對象废睦?鍵值對的集合堆缘?
函數(shù)也行娶靡,函數(shù)當(dāng)作一個(gè)對象寫在里面也行韵洋。
Number捧颅、string景图、Boolean自己就是API,自己里面又有tostring這個(gè)對象或者說這個(gè)API
1.1.2.但是tostring很難寫碉哑,老司機(jī)不是這么寫的
通過類型+ ''挚币,就可以轉(zhuǎn)化為字符串
本來不同類型是不能相加的,但是你偏這么寫了瀏覽器就幫你把數(shù)字先轉(zhuǎn)化為字符串扣典,然后再把字符串拼接起來妆毕。
1.1.3.window.String
1.2.轉(zhuǎn)化為布爾
Boolean
!!任何東西取反兩次就是布爾
js轉(zhuǎn)化布爾的時(shí)候只有5個(gè)false。這些要記下來贮尖。false自己就不算了笛粘,它自己當(dāng)然是false了
mdn falsy
1.3.轉(zhuǎn)為number
parseInt的時(shí)候后面的10就是10進(jìn)制的意思。parseFloat不用加幾進(jìn)制湿硝,因?yàn)楦↑c(diǎn)數(shù)都是10進(jìn)制表示的薪前。
第四種是字符減一個(gè)0,第五種是字符前面用一個(gè)+关斜,但是用的最多的還是第4中因?yàn)楹美斫馐纠ǎ?種可能會理解錯(cuò)。
考試重點(diǎn)考第二種痢畜。
這個(gè)parseInt的意思是把字符解析成int垛膝,所以能解析多少就解析多少鳍侣。所以parseInt('1s')只會解析1
1.4.轉(zhuǎn)null和undefined沒有意義
1.5.轉(zhuǎn)化成對象
2.內(nèi)存圖
瀏覽器妖給HTML+CSS渲染引擎,JS引擎吼拥,HTTP引擎還有其他東西倚聚。
代碼區(qū)和數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)又分stack棧內(nèi)存和heap堆內(nèi)存
1.瀏覽器首先在代碼區(qū)左變量提升凿可,把變量都拿到最上面去惑折。把a(bǔ),b,o,c都放到第一行去
2.然后在stack里面用64位里面,寫了一個(gè)1這個(gè)內(nèi)存是對應(yīng)a的怎么對應(yīng)引擎自己會搞定矿酵。
3.然后同理把b給存了唬复。
4.然后發(fā)現(xiàn)o那就繼續(xù)存,一個(gè)字符會用掉2字節(jié)全肮,16位。所以一行可以放4個(gè)字符棘捣。所以o就專業(yè)楊存掉了辜腺。
5.然后存c
6.然后給o加屬性,這時(shí)候就尷尬了乍恐,c已經(jīng)在前面了评疗。所以只能把c往下移∫鹆遥空出后發(fā)現(xiàn)不夠再移百匆。那如果已經(jīng)有100個(gè)c怎么辦,都往下移嗎呜投。所以非常慢加匈。
上面提出的問題的解決方案是:o在stack內(nèi)存里就不放o的內(nèi)容我放一個(gè)地址,實(shí)際內(nèi)容放到heap內(nèi)存里面仑荐。每次聲明了對象以后就會隨機(jī)給stack一個(gè)heap的地址雕拼。heap想加就加不會限制大小,heap好像很大粘招。
另外如果兩個(gè)對象賦值啥寇。比如var o2= o1不是heap里面復(fù)制o1再覆蓋o2。而是直接把o1的地址復(fù)制一下給o2洒扎。讓o2直接指向o1就行了辑甜。那o2原來的內(nèi)容應(yīng)該會被回收。
引用:對象的變量名是鍵值對的引用袍冷。stack是heap的引用
變量之間的賦值磷醋,都是賦值stack里面的內(nèi)容。變量和對象之間的賦值是把對象的地址給變量难裆。比如b = { 'name' : 'b'}意思是先創(chuàng)建出{'name' : 'b'}在heap里面子檀。然后把這些東西的地址給b镊掖。所以a.name = a .
所以stack里面的賦值和heap給stack賦值是不一樣的。
為什么是self是undefined呢褂痰,因?yàn)殚_始變量上提以后亩进,a就被掛到stack上面了。然后生成{self: a}這時(shí)候還沒把{self: a}的地址給a缩歪,所以a是沒有定義的归薛。
對象的聲明分三部分:
1.變量上提,放到stack
2.heap上面創(chuàng)建對象匪蝙,同時(shí)擁有該對象的地址
3.把地址給變量
如果先聲明a = { }就會有地址了主籍,空的對象也行,反正有容器了就會給一個(gè)地址了逛球。
可以把a(bǔ).x = a = { n: 2}拆成a.x = a; a= {n: 2}
然后每次畫圖的時(shí)候stack這邊就把heap的對象的地址寫上去千元。然后對象里面=變量的話,把變量的內(nèi)容即地址寫上去颤绕⌒液#基本不會錯(cuò)了。
heap沒有被stack引用將被回收奥务。什么 時(shí)候回收物独。瀏覽器自己判斷它覺得內(nèi)存不太夠了就會來回收。賦值時(shí)右邊給左邊氯葬。a = b是b賦值給a
所以fn不是垃圾挡篓,document.body.onclick = fn這個(gè)圖要畫出來。
只有document是在stack里面帚称,document里面的屬性就算是對象官研,他的變量名也是存放heap里面的地址,它自己也在heap里面世杀。
這樣寫的話fn就被回收了阀参。畫圖的時(shí)候時(shí)刻想著對象名放的是對象值的地址。
深拷貝瞻坝、淺拷貝
引用