JS數(shù)據(jù)類型轉(zhuǎn)換

本博客會講解下面幾個概念

數(shù)據(jù)類型轉(zhuǎn)換
內(nèi)存圖
垃圾回收和內(nèi)存泄漏
淺拷貝與深拷貝

數(shù)據(jù)類型轉(zhuǎn)換

1. 任何類型轉(zhuǎn)String(字符)

  • xxx.toString(x)

注意nullundefined類型是不能用此方法將值轉(zhuǎn)為String的地沮,object則轉(zhuǎn)成的結(jié)果不能與我們預(yù)期相符

下面是代碼

(1).toString()  //  "1"
true.toString()  //  "true"
null.toString()  //  Cannot read property 'toString' of null 無法讀取null的'toString'屬性
undefined.toString()  //  Cannot read property 'toString' of undefined 無法讀取undefined的'toString'屬性
{}.toString()  //  Unexpcted token  突如其來的標記
({}).toString()  "[object Object]"
  • String(x)

這個方法則可以將nullundefined轉(zhuǎn)為相應(yīng)的字符串,object還是有之前的問題

下面是代碼

String(1)  //  "1"
String(true)  //  "true"
String(null)  //  "null"
String(undefined)  //  "undefined"
String({})  //  "[object Object]"
  • x+''

利用任何數(shù)值與空字符串相加都會變成字符串羡亩,所以可以用下面這個方法

下面是代碼

1+''  //  "1"
true+''  //  "true"
null+''  //  "null"
undefined+''  //  "undefined"
var o = {}
o+''  //  "[object Object]"

舉個栗子摩疑,如果用1+'1',沒辦法去加畏铆,由于加號只能加相同類型的東西雷袋,所以會把左邊的先.toString,再去加字符串"1"

1+'1'  //  "11"

2. 任何類型轉(zhuǎn)number(數(shù)值)

  • Number(x)

下面是代碼

Number('12345')  //  12345
Number(null)  //  0  
Number(undefined)  //  NaN
Number(true)/Number(false)  //  1/0
var a = {}
Number(a)  //  NaN
  • parseInt(x,10)

'10'是你要轉(zhuǎn)換的進制辞居,不寫的話默認為十進制片排。
parseInt()會從頭開始,能判斷多少就多少速侈,不能判斷的則跳過率寡。MDN資料

下面是代碼

parseInt('12345',10)  //  12345
parseInt(null,10)  //  NaN
parseInt(undefined,10)  //  NaN
parseInt(true,10)/parseInt(false,10)  //  NaN
var a = {}
parseInt(a,10)  //  NaN
  • parseFloat(x)

parseFloat() 函數(shù)解析一個字符串參數(shù)并返回一個浮點數(shù)。MDN資料

下面是代碼

parseFloat('12345')  //  12345
parseFloat(null)  //  NaN
parseFloat(undefined)  //  NaN
parseFloat(true)/parseFloat(false)  //  NaN
var a = {}
parseFloat(a)  //  NaN
  • x-0

任何東西減0也會得到你想要的值

下面是代碼

'111'-0  //  111
null-0  //  0
undefined-0  //  NaN
true-0/false-0  //  1/0
var a ={}
a-0  //  NaN
  • +x

在值前面放個'+'號倚搬,能取它原本的值冶共,以數(shù)字的形式展示

下面是代碼

+'111'  //  111
+null  //  0
+undefined  //  NaN
+true/+false  //  1/0
var a ={}
+a  //  NaN

3. 任何類型轉(zhuǎn)Boolean(布爾)

  • Boolean(x)

用Boolean()函數(shù)轉(zhuǎn)換

  • !!x

在要轉(zhuǎn)換的值前加兩個感嘆號就行

關(guān)于布爾,其他值轉(zhuǎn)換成布爾時只有5個特殊值false,其他都是ture捅僵,這五個false值為:0家卖,NaN''(空字符串)庙楚,null上荡,undefined

4.null和undefined

因為這兩個類型都只有一個值馒闷,所以不需要轉(zhuǎn)換

內(nèi)存圖

要知道對象是由基本類型組成的酪捡,那基本類型又是由什么組成的呢?
比如纳账,我寫了"var a = 1"這行代碼逛薇,計算機到底做了什么,這就需要畫內(nèi)存圖來了解疏虫。

1.假設(shè)你有一個8G的內(nèi)存條
2.操作系統(tǒng)開機即占用來512MB內(nèi)存
3.Chrome 打開即占用 1G 內(nèi)存
4.Chrome 各每個網(wǎng)頁分配一定數(shù)量的內(nèi)存
5.這些內(nèi)存要分給頁面渲染器永罚、網(wǎng)絡(luò)模塊、瀏覽器外殼和 JS 引擎(V8引擎)
6.JS 引擎將內(nèi)存分為代碼區(qū)和數(shù)據(jù)區(qū)

我們只研究數(shù)據(jù)區(qū)
7.數(shù)據(jù)區(qū)分為 Stack(棧內(nèi)存) 和 Heap(堆內(nèi)存)
8.簡單類型的數(shù)據(jù)直接存在 Stack 里
9.復(fù)雜類型的數(shù)據(jù)是把 Heap 地址存在 Stack 里卧秘,而本體數(shù)據(jù)則存在Heap里

遇到問題就畫圖呢袱,不要分析

  • 問題1:
var a = 1
var b = a
b = 2
請問 a 顯示是幾?

這時我們就畫一張圖


題1內(nèi)存圖
var a = 1

我們可以看到a先被賦值為1翅敌,然后把1存到Stack內(nèi)存里

var b = a

接著b把a的Stack里的內(nèi)存復(fù)制里一份放在自己里

b = 2

b的值變成了2产捞,但是并不影響a的值
所以a還是2

  • 問題2
var a = {name: 'a'}
var b = a
b = {name: 'b'}
請問現(xiàn)在 a.name 是多少?

我們再畫一張圖


題2內(nèi)存圖
var a = {name:'a'}

新建一個對象哼御,把它賦值給變量a坯临,a其實只是記錄了該對象對應(yīng)的heap地址,并沒有存該對象本身(a引用了該對象)

var b = a

實際上a只是把該對象的地址復(fù)制了一份給b而已恋昼,并沒有新建一個對象

b = {name:'b'}

b被新賦值了一個對象看靠,所以內(nèi)存地址和對象都是新的,和a的對象沒關(guān)系了液肌,所以a.name的值為'a'

  • 問題3
var a = {name: 'a'}
var b = a
b.name = 'b'
請問現(xiàn)在 a.name 是多少挟炬?

畫內(nèi)存圖~


題3內(nèi)存圖
var a = {name:'a'}

新建變量a儲存對象{name:'a'}的地址

var b = a

b復(fù)制改變量地址

b.name = 'b'

b把該變量的的name值變成'b'
所以a.name的值就是'b'了

  • 問題4
var a = {name: 'a'}
var b = a
b = null
請問現(xiàn)在的a是什么?

內(nèi)存圖內(nèi)存圖


題4內(nèi)存圖
var a = {name:'a'}

新建一個對象嗦哆,把對象的內(nèi)存地址給變量a

var b = a

把a的對象內(nèi)存地址復(fù)制給b

b = null

這里要注意谤祖,null不是對象,所以b并不會影響a對應(yīng)的該對象老速,而是把自己的內(nèi)存從對象內(nèi)存地址變成null對應(yīng)的16位二進制碼

上面就是內(nèi)存圖的畫法和介紹粥喜,平時多畫內(nèi)存圖就不會出錯了

垃圾回收和內(nèi)存泄漏

如果一個對象沒有被引用,它就是垃圾橘券,將被回收

這個可以用內(nèi)存圖來理解

  • 內(nèi)存回收1
var a = {name:xxx}
var b = {name:yyy}
b = null
垃圾回收1

當b指向的對象在b變成null后额湘,就沒有被引用來卿吐,所以這個對象就變成來垃圾,瀏覽器會在不確定什么時候把它的內(nèi)存回收掉(視總占內(nèi)存大小和cpu頻率選擇)

  • 內(nèi)存回收2
var fn = function(){}
document.body.onclick = fn
fn = null
垃圾回收2

如上面這個代碼锋华,當瀏覽器把當前標簽頁關(guān)閉時嗡官,document就不存在了,沒有人引用這些對象了毯焕,所以這三個對象都會回收

  • 內(nèi)存泄漏

但是IE6的垃圾算法有問題衍腥,它無法將之前三個對象標記為垃圾,所以會一直留著

你只要不關(guān)掉整個瀏覽器纳猫,你的內(nèi)存會會充滿垃圾婆咸,無法重復(fù)利用

這就是內(nèi)存泄漏

淺拷貝與深拷貝

深拷貝

var a = 1
var b = a
b = 2 //這個時候改變 b
a 完全不受 b 的影響
那么我們就說這是一個深復(fù)制(深拷貝)

對于簡單類型的數(shù)據(jù)來說,賦值就是深拷貝续担。

對于復(fù)雜類型的數(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: 'jiujizi'}
var b = deepClone(a) // deepClone 還不知道怎么實現(xiàn)
b.name = 'b'
a.name === 'a' // true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末询兴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子起趾,更是在濱河造成了極大的恐慌诗舰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件训裆,死亡現(xiàn)場離奇詭異眶根,居然都是意外死亡,警方通過查閱死者的電腦和手機边琉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門属百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人变姨,你說我怎么就攤上這事族扰。” “怎么了定欧?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵渔呵,是天一觀的道長。 經(jīng)常有香客問我砍鸠,道長扩氢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任爷辱,我火速辦了婚禮类茂,結(jié)果婚禮上耍属,老公的妹妹穿的比我還像新娘。我一直安慰自己巩检,他們只是感情好厚骗,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兢哭,像睡著了一般领舰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迟螺,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天冲秽,我揣著相機與錄音,去河邊找鬼矩父。 笑死锉桑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窍株。 我是一名探鬼主播民轴,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼球订!你這毒婦竟也來了后裸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冒滩,失蹤者是張志新(化名)和其女友劉穎微驶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體开睡,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡因苹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了篇恒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扶檐。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婚度,靈堂內(nèi)的尸體忽然破棺而出蘸秘,到底是詐尸還是另有隱情,我是刑警寧澤蝗茁,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布醋虏,位于F島的核電站,受9級特大地震影響哮翘,放射性物質(zhì)發(fā)生泄漏颈嚼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一饭寺、第九天 我趴在偏房一處隱蔽的房頂上張望阻课。 院中可真熱鬧叫挟,春花似錦、人聲如沸限煞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽署驻。三九已至奋献,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旺上,已是汗流浹背瓶蚂。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宣吱,地道東北人窃这。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像征候,于是被迫代替她去往敵國和親杭攻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354