
各類(lèi)型轉(zhuǎn)換
變string方法.
- toString()如表所示
var a = 1
a.toString() //'1'
var b = null
b.toString() //報(bào)錯(cuò)
var c = undefined
c.toString() //報(bào)錯(cuò)
var d = true
d.toString //'true'
-
需要轉(zhuǎn)義的數(shù)據(jù) + '',可以變成字符串
1 + '' //'1'
true + '' //'true'
null + '' //'null'
undefined + '' //'undefined'
obj + '' //[object Object]
-
window.String().結(jié)果與上種方法相同
布爾值
1.Boolean()
Boolean(1) //true
Boolean(0) //false
Boolean('hello') //true
Boolean({}) //true
Boolean(false) //false
- !!
!! null //false
!! undefined //false
!! '' //false
!! ' ' //true
!!NaN //false
- 六個(gè)falsy值: falsy是在
Boolean上下文中認(rèn)定可轉(zhuǎn)換為false的值.
0,NaN,unll,undefined,'',false
數(shù)字
Number('1') //1
parseInt('1',10) //1
parseFloat('1.23') //1.23
'1'-0 //1
+'-1.23' //-1.23
關(guān)于內(nèi)存
數(shù)字為64位
字符為16位
JS的內(nèi)存存儲(chǔ)分為Stack棧內(nèi)存和Heap堆內(nèi)存
普通的數(shù)據(jù)按照順序存儲(chǔ)在Stack棧內(nèi)存里
對(duì)象內(nèi)的數(shù)據(jù)按照無(wú)序存儲(chǔ)在Heap堆內(nèi)存,存在Stack中的是一個(gè)地址
-
等于號(hào)只做一件事情,把一個(gè)數(shù)據(jù)拷貝到另一個(gè)數(shù)據(jù)
一下是一個(gè)示意圖。不會(huì)的時(shí)候,就畫(huà)圖!不會(huì)的時(shí)候,就畫(huà)圖?。〔粫?huì)的時(shí)候,就畫(huà)圖?。?!
關(guān)于循環(huán)引用
var a = {self:a}
a.self //undefined 由于變量提升不能循環(huán)引用
var a ={}
a.self = a
a.self.self //self{self:{...}}
引用類(lèi)型
var a = {n:1};
var b = a;
a.x = a = {n:2};
alert(a.x); //undefined
alert(b.x); //[object Object]
垃圾回收
如果一個(gè)對(duì)象沒(méi)有被引用,它就是垃圾,將被回收
var a = {name:'a'}
var b = {name:'b'}
a = b //{name:a}將會(huì)被回收
var fn = function(){}
document.body.onclick = fn
fn = null //此時(shí)的function(){}并不是垃圾
內(nèi)存泄漏:由于IE9之前的瀏覽器存在的垃圾回收機(jī)制的問(wèn)題。會(huì)導(dǎo)致一些元素?zé)o法被銷(xiāo)毀。
解決辦法:將需要回收的元素和數(shù)據(jù)設(shè)置為null
深拷貝與淺拷貝
基本類(lèi)型在賦值的時(shí)候都是深拷貝
深拷貝是更改了Heap里的內(nèi)容,所以Stack里的其他與之相關(guān)的內(nèi)容會(huì)一起改變。
var a = 1
var b = a
b = 2
a = 1 //b變不影響a。此為深拷貝
淺拷貝就是Heap的內(nèi)容增加了拷貝項(xiàng),所以不會(huì)影響到Stack里與之相關(guān)的內(nèi)容。
var a = {name:a}
var b = a
b.name = 'b'
a.name = 'b' //b變了a也變。此為淺拷貝
總結(jié):深拷貝其實(shí)就是要拷貝Heap中的內(nèi)容
——遠(yuǎn)方不遠(yuǎn)