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

類型轉(zhuǎn)換

任意類型轉(zhuǎn)字符串
  1. String(x)
String(1)    //"1"
String(true)    //"true"
String(null)    //"null"
String(undefined)    //"undefined"
String({})    //"[object Object]"
  1. 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]"
  1. x+""(或者""+x) //老司機(jī)專用
1+''    //"1"
true+''    //"true"
null+''    //"null"
undefined+''    //"undefined"
{}+''    //0
var o={}
o+''    //"[object Object]"
任意類型轉(zhuǎn)數(shù)字
  1. Number(x)
  2. parseInt(x, 10) MDN
  3. parseFloat(x) MDN
  4. x - 0 (老司機(jī)專用)
  5. +x (容易出錯(cuò))
任意類型轉(zhuǎn)布爾
  1. Boolean(x)
  2. !!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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容