1.**ECMAScript中的所有參數(shù)傳遞的都是值,不可能通過引用傳遞參數(shù)。**
2.**五種基本數(shù)據(jù)類型是按值訪問的**,因為可以操作保存在變量中的實際值。引用類型的值是保存在內(nèi)存中的對象。與其他語言不同,JavaScript不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。因此,**引用類型的值是按引用訪問的。(實際上這種說法并不嚴(yán)密,當(dāng)復(fù)制保存著對象的某個變量時,操作的是對象的引用。但在為對象添加屬性是,操作的是實際的對象。)**
3.對于引用類型的值,我們可以為其添加屬性和方法,也可以改變和刪除其屬性和方法。但是,我們不能給基本類型的值添加屬性,盡管這樣做不會拋出錯誤。這說明只能給引用類型動態(tài)地添加屬性,以便將來使用。
4.復(fù)制引用操作時,復(fù)制操作結(jié)束后,兩個變量實際上將引用同一個對象。因此,改變其中一個變量,就會影響另一個變量。
5.**ECMAScript中所有參數(shù)都是按值傳遞的。當(dāng)我們給函數(shù)傳入?yún)?shù)時,實際就是把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),這和把值從一個變量復(fù)制到另一個變量一樣。**
為了說明函數(shù)的參數(shù)是按值傳遞的,請看下面的例子:
~~~
function setName(obj) {
//相當(dāng)于省略了var obj = person;
obj.name = ‘Nicholas’;
obj = new Object(); //重寫了obj的值,這時候obj與person引用的對象無關(guān)了。
obj.name = ‘Greg’;
}
var person = new Object();
setName(person);
alert(person.name); //‘Nicholas’
~~~
**個人理解:如果參數(shù)是按引用傳遞的話,那么obj和person應(yīng)該始終指向同一個對象,實際上把person傳入到setName中只不過是把person指向的對象的指針副本復(fù)制給obj。給ECMAScript函數(shù)傳變量,相當(dāng)于把外部變量賦值給函數(shù)內(nèi)的局部變量。**
另一個面試中常見的陷阱:
~~~
var foo = {
bar: function(){return this.baz;},
baz: 1};?
(function(){return?typeof?arguments[0]();})(foo.bar); //undefined
~~~
相當(dāng)于arguments[0] = function(){return?this.baz;}
6.***instanceof操作符用于檢測變量的具體引用類型***。如果變量是給定引用類型的實例,則返回true。
語法:result = variable instanceof constructor;
7.在Web瀏覽器中,全局執(zhí)行環(huán)境被認(rèn)為是window對象,因此所有全局變量和函數(shù)都是作為window對象的屬性和方法創(chuàng)造的。**某個執(zhí)行環(huán)境中的所有代碼執(zhí)行完畢后,該環(huán)境被銷毀,保存在其中的所有變量和函數(shù)定義也隨之銷毀**(全局執(zhí)行環(huán)境直到應(yīng)用程序退出--例如關(guān)閉網(wǎng)頁或瀏覽器--時才會被銷毀)。
8.延長作用域鏈的方法有兩個:
--try-catch語句的catch塊
--with語句
這兩個語句都會在作用域鏈的前端添加一個變量對象。對with語句來說,會將指定對象添加到作用域鏈中。對catch語句來說,會創(chuàng)建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明。
9.JavaScript中沒有塊級作用域,因此if語句中的變量聲明會添加到當(dāng)前的執(zhí)行環(huán)境中。在使用for語句時尤其要牢記這一差異,例如:
~~~
for (var i=0; i <10; i++) {
doSomething(i)
}
alert(i); // 10
~~~
10.***優(yōu)化內(nèi)存占用的最佳方式,就是為執(zhí)行中的代碼只保留必要的數(shù)據(jù)。一旦全局對象、全局對象屬性以及循環(huán)引用變量的引用不再有用,最好通過將其值設(shè)置為null來釋放其引用--這個做法叫做解除引用。這一做法適用于大多數(shù)全局變量和全局對象的屬性***。如下面這個例子所示:
~~~
function creatPerson(name) {
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = creatPerson(‘Ken’);
globalPerson = null; //在不使用它的時候手工為它解除引用。
~~~
11.基本類型值在內(nèi)存中占據(jù)固定空間大小,因此被保存在棧內(nèi)存中;引用類型的值是對象,保存在堆內(nèi)存中。
- 第一章 JavaScript簡介
- 第二章 在HTML中使用JavaScript
- 第三章 基本概念
- 第四章 變量、作用域和內(nèi)存問題
- 第五章 引用類型
- 第六章 面向?qū)ο蟮某绦蛟O(shè)計
- 第七章 函數(shù)表達(dá)式
- 第八章 BOM
- 第九章 客戶端檢測
- 第十章 DOM
- 第十一章 DOM擴展
- 第十二章 DOM2和DOM3
- 第十三章 事件
- 第十四章 表單腳本
- 第十六章 HTML5腳本程序
- 第十七章 錯誤處理與調(diào)試
- 第二十章 JSON
- 第二十一章 AJAX和Comet
- 第二十二章 高級技巧
- 第二十三章 離線應(yīng)用與客戶端存儲
- 第二十四章 最佳實踐
- 第二十五章 新興的API
