JS中的7種數(shù)據(jù)之間大部分是可以相互轉(zhuǎn)換的,這篇文章做一個小小的總結(jié)。
一.任意類型轉(zhuǎn)字符串
1.toString()方法。
true.toString = 'true'
({}).toString = '[object Object]'
對于數(shù)據(jù)類型null
和undefined
是不能夠用toString()
方法的。
2.全局方法String()
String(1)
'1'
String(true)
'true'
String(null)
'null'
String(undefined)
'undefined'
String({})
'[object Object]'
3.任意類型用+
拼接空字符串 ''
1 + ''
'1'
true + ''
'true'
需要注意的是當對象與空字符串拼接時次和,用以下方式:
{} + ''
0
var o = {}
o + ''
'[object Object]'
二.轉(zhuǎn)數(shù)字類型
1.全局方法 Number()
使用Number函數(shù),可以將任意類型的值轉(zhuǎn)化成數(shù)值那伐。Number函數(shù)將字符串轉(zhuǎn)為數(shù)值踏施,要比parseInt函數(shù)嚴格很多⌒酰基本上读规,只要有一個字符無法轉(zhuǎn)成數(shù)值,整個字符串就會被轉(zhuǎn)為NaN燃少。
- parseInt(x, 10) ,其具體的使用方式見:MDN
3.parseFloat(x) ,具體使用方式見:MDN
4.X - 0
铃在,當用字符串類型減去數(shù)字0阵具,也可以實現(xiàn)類型的轉(zhuǎn)換
'1' - 0
1
-
+ X
與方式4類型碍遍,通過+號與X拼接的形式
三.任意類型轉(zhuǎn)Boolean
1.全局方法 Boolean(x)
2.技巧:!! x
x的雙重否定還是它自身。
JS中有六個值會被視為false阳液,見我的上一篇文章:JS里的數(shù)據(jù)類型
四.用內(nèi)存圖解釋關(guān)于object的常見問題
用一個比較簡單的方法解釋JS數(shù)據(jù)在內(nèi)存中存儲:
1.JS 引擎將內(nèi)存分為代碼區(qū)和數(shù)據(jù)區(qū)
2.我們只研究數(shù)據(jù)區(qū)
3.數(shù)據(jù)區(qū)分為 Stack(棧內(nèi)存) 和 Heap(堆內(nèi)存)
4.簡單類型的數(shù)據(jù)直接存在 Stack 里
5.復雜類型的數(shù)據(jù)是把 Heap 地址存在 Stack 里
例如:
var a = 1
var b = a
var b = 2
a
1
b變量的變化并不會影響a變量怕敬,因為簡單的數(shù)據(jù)類型會存儲在stack內(nèi)存中。但對于復雜數(shù)據(jù)如object帘皿,當我們聲明一個對象時东跪,其在stack中存儲一個地址,該地址是其在heap中的具體地址鹰溜。簡單地說虽填,就是stack中是該對象的引用。以如下常見的面試題為例:
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 是什么墓陈?
// 'a'
如下關(guān)于變量提示的面試題:
var o = {self:o}
o.self
//undefined
因為上面的代碼相當于如下:
var o
o = {self:o}
o.self
//undefined
變量o被先聲明了卻沒有賦值恶守,所以為undefined。
6.垃圾回收
如果一個對象在heap中沒有被引用了贡必,就會被瀏覽器當作垃圾兔港,在合適的時間被回收,釋放出該內(nèi)存空間仔拟。但在IE 6瀏覽器中衫樊,會存在垃圾回收的BUG,稱為內(nèi)存泄露理逊。
6.深拷貝與淺拷貝
var a = 1
var b = a
b = 2 //這個時候改變 b
上述代碼中橡伞,a 完全不受 b 的影響,我們就稱之為深拷貝晋被。
1.對于簡單類型的數(shù)據(jù)來說兑徘,賦值就是深拷貝。
2.對于復雜類型的數(shù)據(jù)(對象)來說羡洛,才要區(qū)分淺拷貝和深拷貝挂脑。
如上述JS常見面試題中的一道題:
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
對b進行操作后,a也被改變了欲侮,這種情況就是淺拷貝崭闲。如果對a對象heap內(nèi)存中的數(shù)據(jù)也進行完全拷貝,此時a與b就不會互相影響威蕉,這種情況就是深拷貝刁俭。