一、數(shù)據(jù)類(lèi)型轉(zhuǎn)換
JavaScript 中,變量可以賦予任何類(lèi)型的值。但是運(yùn)算符對(duì)數(shù)據(jù)類(lèi)型是有要求的,如果運(yùn)算符發(fā)現(xiàn),運(yùn)算子的類(lèi)型與預(yù)期不符,就會(huì)自動(dòng)轉(zhuǎn)換類(lèi)型。數(shù)據(jù)類(lèi)型除了可以自動(dòng)轉(zhuǎn)換以外,還可以手動(dòng)強(qiáng)制轉(zhuǎn)換。
1、轉(zhuǎn)為字符串(string)
-
toString()方法 :可將其它類(lèi)型轉(zhuǎn)為字符串類(lèi)型,但對(duì)null和undefined不適用:
toString()
- 當(dāng)某些場(chǎng)合只能用字符串類(lèi)型時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用
toString()將非字符串的內(nèi)容轉(zhuǎn)為字符串:
上圖命令2中系統(tǒng)會(huì)自動(dòng)將數(shù)字自動(dòng)調(diào)用 toString1轉(zhuǎn)換為字符串1,等價(jià)于命令3.
- 轉(zhuǎn)字符串快捷方法
其它類(lèi)型 + ''或'' + 其它類(lèi)型:其他類(lèi)型與一個(gè)空字符串相加,此方法對(duì)null和undefined也適用:
轉(zhuǎn)字符串快捷方法
- 不同類(lèi)型相加
因?yàn)?+只能用于相同類(lèi)型相加,遇到不同類(lèi)型相加時(shí)會(huì)嘗試改變其中的一個(gè)類(lèi)型,下圖中命令2等價(jià)于命令3:
不同類(lèi)型相加
- 轉(zhuǎn)字符串全局方法
String()函數(shù):可將任意類(lèi)型的值轉(zhuǎn)為字符串,對(duì)null和undefined也適用:
轉(zhuǎn)字符串全局方法
2、轉(zhuǎn)為布爾值(boolean)
- 轉(zhuǎn)布爾值全局方法
Boolean()函數(shù):可將其他類(lèi)型轉(zhuǎn)為布爾值。
Boolean()
- 由上圖可知,轉(zhuǎn)為布爾值的規(guī)則為:
數(shù)字:0 —— false;NaN —— false;其他值 —— true.
字符串:空字符串 —— false;非空字符串 —— true.
對(duì)象:所有對(duì)象 —— true.
null —— false.
undefined —— false.
-
falsy
falsy 是在 Boolean 上下文中認(rèn)定可轉(zhuǎn)換為false 的值。
五個(gè) falsy 值:0,NaN,''(""),null,undefined
- 轉(zhuǎn)布爾值快捷方法
!! 其它類(lèi)型:!為“取反”之意,因此加兩個(gè)!!取反兩次即得到本身的布爾值。
轉(zhuǎn)布爾值快捷方法
3、轉(zhuǎn)為數(shù)字(Number)
- 轉(zhuǎn)數(shù)字全局方法
Number()函數(shù):可以將任意類(lèi)型的值轉(zhuǎn)化成數(shù)值。
Number()
注意:Number() 函數(shù)將不可以被解析為數(shù)值的字符串轉(zhuǎn)為NaN,將空字符串轉(zhuǎn)為0。 - 轉(zhuǎn)數(shù)字全局函數(shù)
parseInt()函數(shù):轉(zhuǎn)為整數(shù)時(shí)最好加上進(jìn)制;因?yàn)楦↑c(diǎn)數(shù)只有十進(jìn)制,所以轉(zhuǎn)為浮點(diǎn)數(shù)時(shí)進(jìn)制可省略。(parse:解析)
- 轉(zhuǎn)為整數(shù):
parseInt(字符串,進(jìn)制) - 轉(zhuǎn)為浮點(diǎn)數(shù):
parseFloat()
parseInt()parseFloat()
- 轉(zhuǎn)數(shù)字快捷方法:
- '0'或+ '數(shù)字':減去字符 0 或用 0 加這個(gè)字符,都等于這個(gè)數(shù)本身的數(shù)值
轉(zhuǎn)數(shù)字快捷方法
二、內(nèi)存圖
1. 內(nèi)存 vs 外存
- 內(nèi)存:速度快,斷電后內(nèi)容丟失
- 外存:速度慢,斷電后內(nèi)容不丟失
2. 內(nèi)存圖
- 打開(kāi)瀏覽器,各個(gè)網(wǎng)頁(yè)都會(huì)分配一定數(shù)量的內(nèi)存,這些內(nèi)存要分給頁(yè)面渲染器、網(wǎng)絡(luò)模塊、瀏覽器外殼和 JS 引擎(V8引擎)
- 數(shù)字都是 64 位,字符都是 16 位,值有七種數(shù)據(jù)類(lèi)型
- JS 引擎將內(nèi)存分為代碼區(qū)和數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)分為 Stack(棧內(nèi)存) 和 Heap(堆內(nèi)存) - 簡(jiǎn)單類(lèi)型的數(shù)據(jù)直接存在 Stack 里:
(n/s/nul/boo/und/def/sym/)
復(fù)雜類(lèi)型的數(shù)據(jù)是把 Heap 地址存在 Stack 里(引用):(obj) -
例:內(nèi)存圖
3. a.self 是如何存儲(chǔ)的?
Stack 里存儲(chǔ) Heap 的地址,Heap 里也儲(chǔ)存 Stack 的內(nèi)容(即地址),不會(huì)占用無(wú)數(shù)個(gè)內(nèi)存。
var a = {}
a.self = a
a.self.self.self
4. GC 垃圾回收
如果一個(gè)對(duì)象沒(méi)有被引用,它就是垃圾,將被回收。
- 例:
var fn = function()
document.body.onclick = fn
fn = null
// 問(wèn):function() 是垃圾嗎? // 答:function() 被引用,不是垃圾。

垃圾回收
- 當(dāng)瀏覽器頁(yè)面關(guān)掉時(shí),document 將不存在,body、onclick 和 function() 三者都會(huì)變成垃圾(IE6 Bug 除外)。
5. 內(nèi)存泄漏
- 內(nèi)存泄漏:由于瀏覽器的一些 bug,使得該被標(biāo)記為垃圾的東西沒(méi)有被標(biāo)記為垃圾,內(nèi)存就被永久地占用著,直到關(guān)掉瀏覽器。
- 解決辦法:瀏覽器關(guān)閉之前,把所有不再引用的事件都置為 null.
window.onunload = function(){
document.body.onclick = null
}
6. 淺拷貝 vs 深拷貝
-
深拷貝:b 變不影響 a
對(duì)于簡(jiǎn)單類(lèi)型的數(shù)據(jù)來(lái)說(shuō),賦值就是深拷貝。
對(duì)于復(fù)雜類(lèi)型的數(shù)據(jù)(對(duì)象)來(lái)說(shuō),才要區(qū)分淺拷貝和深拷貝。
var a = 1
var b = a
b = 2
// 問(wèn):a = ? // 答:a = 1
- 淺拷貝:b 變致 a 變
var a = {name: 'a'}
var b = a
b.name = 'b'
// 問(wèn):a.name = ? // 答:a.name 也變成了 'b'











