類型轉(zhuǎn)換
任意類型轉(zhuǎn)字符串
- String(x)
String(1) //"1"
String(true) //"true"
String(null) //"null"
String(undefined) //"undefined"
String({}) //"[object Object]"
- x.toString()
(1).toString() //"1"
true.toString() //"true"
null.toString() //Uncaught TypeError: Cannot read property 'toString' of null at <anonymous>:1:6
undefined.toString() //VM89:1 Uncaught TypeError: Cannot read property 'toString' of undefined at <anonymous>:1:11
({}).toString() //"[object Object]"
- x+""(或者""+x) //老司機(jī)專用
1+'' //"1"
true+'' //"true"
null+'' //"null"
undefined+'' //"undefined"
{}+'' //0
var o={}
o+'' //"[object Object]"
任意類型轉(zhuǎn)數(shù)字
任意類型轉(zhuǎn)布爾
- Boolean(x)
- !!x (老司機(jī)專用)
五個(gè)falsy值
0,null,undefined,'',NaN
- 數(shù)字里面有兩個(gè),對(duì)象沒有
- 具體看MDN?falsy
內(nèi)存圖
Stack 棧內(nèi)存(number、string、undefined、symbol、boolean,簡(jiǎn)單類型都存儲(chǔ)在這)
Heap 堆內(nèi)存(object,包括(array,function)把地址存儲(chǔ)在棧中,存儲(chǔ)復(fù)雜類型)

第一個(gè)問題
var a = 1
var b = a
b = 2
請(qǐng)問 a 顯示是幾? //1

第二個(gè)問題
var a = {name: 'a'}
var b = a
b = {name: 'b'}
請(qǐng)問現(xiàn)在 a.name 是多少? //'a'

第三個(gè)問題
var a = {name: 'a'}
var b = a
b.name = 'b'
請(qǐng)問現(xiàn)在 a.name 是多少? //'b'

第四個(gè)問題
var a = {name: 'a'}
var b = a
b = null
請(qǐng)問現(xiàn)在 a 是什么? // {name: 'a'}
循環(huán)引用
var a
a={self:a} //{self:undefined}
var a={}
a.self=a //{self:{...}}
不同之處在第一個(gè)一開始沒有聲明對(duì)象,所以a是undefined,第二個(gè)是一開始聲明了一個(gè)對(duì)象,所以a是一個(gè)地址,然后a里面的self對(duì)于這個(gè)地址,所以產(chǎn)生循環(huán)。
一個(gè)面試題

一個(gè)面試題
垃圾回收
如果一個(gè)對(duì)象沒有被利用,那它就是垃圾,將被回收
var fn=function(){}
document.body.onclick=fn
fn=null
那么function(){}是不是垃圾? //不是,原理如下圖
若把頁面關(guān)了,則fn變成垃圾,Heap里面的東西也是垃圾。
IE6認(rèn)為Heap里面不是垃圾,這是IE6的bug(內(nèi)存泄漏),解決辦法是在頁面關(guān)閉之前,把所有事件都置為null

垃圾回收面試題
深拷貝和淺拷貝
var a = 1
var b = a
b = 2 //這個(gè)時(shí)候改變 b
a 完全不受 b 的影響
那么我們就說這是一個(gè)深復(fù)制
對(duì)于簡(jiǎn)單類型的數(shù)據(jù)來說,賦值就是深拷貝。 對(duì)于復(fù)雜類型的數(shù)據(jù)(對(duì)象)來說,才要區(qū)分淺拷貝和深拷貝。
這是一個(gè)淺拷貝的例子:
var a = {name: 'zou'}
var b = a
b.name = 'b'
a.name === 'b' // true
因?yàn)槲覀儗?duì) b 操作后,a 也變了
什么是深拷貝了,就是對(duì) Heap 內(nèi)存進(jìn)行完全的拷貝。
var a = {name: 'zou'}
var b = deepClone(a) //還不會(huì)實(shí)現(xiàn)
b.name = 'b'
a.name === 'zou' // true