
<script type="text/javascript"> var box = 'Lee'; //在棧內(nèi)存生成一個(gè)box 'Lee' var box2 = box; //在棧內(nèi)存再生成一個(gè)box2 'Lee'</script>引用類型的變量復(fù)制:
<script type="text/Javascript"> var box = new Object(); //創(chuàng)建一個(gè)引用類型 box.name = 'Lee'; //新增一個(gè)屬性 var box2 = box; //把引用地址賦值給box2</script>檢測類型
雖然typeof運(yùn)算符在檢查基本數(shù)據(jù)類型的時(shí)候非常好用,但檢測引用類型的時(shí)候,它就不是那么好用了。通常,我們并不想知道它是不是對(duì)象,而是想知道它到底是什么類型的對(duì)象。因?yàn)閿?shù)組也是object,null也是Object等等。這時(shí)我們可以采用instanceof運(yùn)算符來查看。<script type="text/javascript"> var box = [1,2,3]; console.log(box instanceof Array); //true console.log(box instanceof Object); //true var box2 = {}; console.log(box2 instanceof Object); //true var box3 = /g/; console.log(box3 instanceof RegExp); //true var box4 = new String('Lee'); console.log(box4 instanceof String); //true var a = "lisong"; console.log(a instanceof String); //false</script>當(dāng)使用instanceof檢查基本類型的值時(shí),它會(huì)返回false執(zhí)行環(huán)境及作用域
全局執(zhí)行環(huán)境是最外圍的執(zhí)行環(huán)境。在Web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對(duì)象。因此所有的全局變量和函數(shù)都是作為window對(duì)象的屬性和方法創(chuàng)建的。當(dāng)執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀。如果是全局環(huán)境下,需要程序執(zhí)行完畢,或者網(wǎng)頁被關(guān)閉才會(huì)銷毀。每個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象,就好比全局的window可以調(diào)用變量和屬性一樣。局部的環(huán)境也有一個(gè)類似window 的變量對(duì)象,環(huán)境中定義的所有變量和函數(shù)都保存在這個(gè)對(duì)象中。(我們無法訪問這個(gè)變量對(duì)象,但解析器會(huì)處理數(shù)據(jù)時(shí)后臺(tái)使用它)<script type="text/javascript"> var box = 'blue'; function setBox() { function setColor() { var b = 'orange'; alert(box); alert(b); } setColor(); //setColor()的執(zhí)行環(huán)境在setBox()內(nèi) } setBox();</script>每個(gè)函數(shù)被調(diào)用時(shí)都會(huì)創(chuàng)建自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行到這個(gè)函數(shù)時(shí),函數(shù)的環(huán)境就會(huì)被推到環(huán)境棧中去執(zhí)行,而執(zhí)行后又在環(huán)境棧中彈出(退出),把控制權(quán)交給上一級(jí)的執(zhí)行環(huán)境。var關(guān)鍵字在函數(shù)里的區(qū)別:function box(num1, num2) { var sum = num1 + num2; //如果去掉var就是全局變量了 return sum;}alert(box(10,10));alert(sum); //報(bào)錯(cuò)變量查詢中,訪問局部變量要比全局變量更快,因?yàn)椴恍枰蛏纤阉髯饔糜蜴湥人阉鞯降膬?yōu)先級(jí)高。塊級(jí)作用域表示諸如if語句等有花括號(hào)封閉的代碼塊。但是在js中是沒有塊級(jí)作用域的,即使for語句也不存在塊級(jí)作用域。內(nèi)存問題
JavaScript具有自動(dòng)垃圾收集機(jī)制,也就是說,執(zhí)行環(huán)境會(huì)負(fù)責(zé)管理代碼執(zhí)行過程中使用的內(nèi)存。其他語言比如C和C++,必須手工跟蹤內(nèi)存使用情況,適時(shí)的釋放,否則會(huì)造成很多問題。而JavaScript則不需要這樣,它會(huì)自行管理內(nèi)存分配及無用內(nèi)存的回收。JavaScript最常用的垃圾收集方式是標(biāo)記清除。垃圾收集器會(huì)在運(yùn)行的時(shí)候給存儲(chǔ)在內(nèi)存中的變量加上標(biāo)記。然后,它會(huì)去掉環(huán)境中正在使用變量的標(biāo)記,而沒有被去掉標(biāo)記的變量將被視為準(zhǔn)備刪除的變量。最后,垃圾收集器完成內(nèi)存清理工作,銷毀那些帶標(biāo)記的值并回收他們所占用的內(nèi)存空間。垃圾收集器是周期性運(yùn)行的,這樣會(huì)導(dǎo)致整個(gè)程序的性能問題。比如IE7以前的版本,它的垃圾收集器是根據(jù)內(nèi)存分配量運(yùn)行的,比如256個(gè)變量就開始運(yùn)行垃圾收集器,這樣,就不得不頻繁地運(yùn)行,從而降低的性能。一般來說,確保占用最少的內(nèi)存可以讓頁面獲得更好的性能。那么優(yōu)化內(nèi)存的最佳方案,就是一旦數(shù)據(jù)不再有用,那么將其設(shè)置為null來釋放引用,這個(gè)做法叫做解除引用。這一做法適用于大多數(shù)全局變量和全局對(duì)象。
新聞熱點(diǎn)
疑難解答
圖片精選