類型之間的轉(zhuǎn)換
轉(zhuǎn)換為字符串
Console.log
打印的都是字符串。
string
tostring
x+''
這種方法最方便废睦,1+''
施符,但是需要注意,{}+''
為0慈迈,存在變量里面的空對象可以若贮。
轉(zhuǎn)換數(shù)字Number
Number(x)
Number(true)
1
Number(null)
0
Number(false)
0
parseInt(x, 10)
- 如果字符串
string
以"0x"或者"0X"開頭, 則基數(shù)是16 (16進制). - 如果字符串
string
以"0"開頭, 基數(shù)是8(八進制)或者10(十進制),那么具體是哪個基數(shù)由實現(xiàn)環(huán)境決定。ECMAScript 5 規(guī)定使用10谴麦,但是并不是所有的瀏覽器都遵循這個規(guī)定蠢沿。因此,永遠都要明確給出radix參數(shù)的值匾效。 - 如果字符串
string
以其它任何值開頭舷蟀,則基數(shù)是10 (十進制)。
parseInt('011')
11
parseInt('011',8)
9
parseInt('011',10)
11
parseInt('s')
NaN
parseInt('1s')
1
parseFloat(x)
x - 0
+x
轉(zhuǎn)換布爾Boolean
Boolean(x)
!!x
更常用
是除了下面六個值被轉(zhuǎn)為
false
面哼,其他值都視為true
野宜。
undefined
null
false
0
NaN
-
""
或''
(空字符串)
js內(nèi)存圖
var a = 1
var b = 2
var c = {
name = 'cuilei'
Age = '24'
}
這些代碼對計算機做了什么。
1.變量提升
2.js中64位浮點數(shù)存儲1
精绎,屬于stack數(shù)據(jù)結(jié)構(gòu)速缨。
3.存儲object時,使用heap數(shù)據(jù)結(jié)構(gòu)更靈活代乃,可以后期修改內(nèi)容旬牲。如果使用stack,后期更改順序搁吓,添加刪除內(nèi)容都要更改順序原茅,很麻煩。stack數(shù)據(jù)結(jié)構(gòu)的特點堕仔。
4.object在stack中存指定地址擂橘,地址引用heap中存儲的數(shù)據(jù)。
- 你買一個 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 里
基本類型變量存的是值,復雜類型的變量存的是內(nèi)存地址恼五。
基本類型在賦值的時候拷貝值昌罩,復雜類型在賦值的時候只拷貝地址,不拷貝值灾馒。
var a = {}
a.self = a//self里面存了a的地址
a.self.self.self
垃圾回收
如果對象沒有被引用茎用,他就會被垃圾回收。
var fn = function(){}
document.body.onclick = fn
fn = null//fn不是垃圾
頁面關掉fn變成垃圾
ie有bug睬罗,認為fn不是垃圾
深拷貝和淺拷貝
var a = 1
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