《javaScript高級程序設(shè)計(jì)》讀書筆記(四)

以下內(nèi)容可能存在個人理解的部分,并非完全參照原文

如有疑問,請以書中內(nèi)容為準(zhǔn)

接著上一篇的內(nèi)容

3.6 語句

大部分和其他語言差不多

只需要注意ECMAScript沒有塊級作用域

var count = 10;
for(var i = 0; i < count; i++) {
    alert(i);
}
alert(i); // 10

{}聲明的變量可以在外部訪問到

3.7 函數(shù)

理解參數(shù)

ECMAScript函數(shù)的參數(shù)與大多數(shù)其他語言不同。

ECMAScript函數(shù)不介意傳遞進(jìn)來多少個參數(shù),也不在乎傳進(jìn)來的參數(shù)是什么數(shù)據(jù)類型。即便你定義的函數(shù)只接受兩個參數(shù),在調(diào)用時也未必一定要傳遞兩個參數(shù)。

原因是ECMAScript中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)。

實(shí)際上,在函數(shù)體內(nèi)可以通過arguments對象來訪問這個參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個參數(shù)。

arguments對象與數(shù)組類似(但不是Array的實(shí)例),可以使用[]來訪問他的每一個元素,使用length屬性來確定傳遞進(jìn)來多少個參數(shù)。

可以這樣

function doAdd() {
    if(arguments.length == 1) {
        alert(arguments[0] + 10);
    } else if (arguments.length == 2) {
        alert(arguments[0] + arguments[1]);
    }
}
doAdd(10);      // 20
doAdd(20,30);   // 50

關(guān)于arguments的行為,還有一點(diǎn)比較有意思。那就是它的值永遠(yuǎn)與對應(yīng)命名參數(shù)的值保持同步。

但是如果那個命名參數(shù)沒有傳入值,使用arguments設(shè)置的值將不會反映到命名參數(shù)中

function doAdd(num1,num2){
    arguments[1] = 10;
    alert(arguments[0] + num2);
}
test(1)     // NaN -- 1 + undefined
test(1,2)   // 11

沒有重載

定義兩個同名函數(shù),則該名字只屬于后定義的函數(shù)。

第四章 變量、作用域和內(nèi)存問題

JavaScript變量松散類型的本質(zhì),決定了它只是在特定事件用于保存特定值的一個名字而已。

4.1 基本類型和引用類型的值

基本類型值指的是簡單的數(shù)據(jù)段,有Undefined、Null、BooleanNumberString

引用類型值指那些可能由多個值構(gòu)成的對象

JavaScript不允許直接訪問內(nèi)存中的位置

ECMAScipt中的字符串是以基本類型來表示的,而不是對象

動態(tài)的屬性

我們只能給對象添加屬性

var person = new Object();
person.name = "Nicholas";
alert(person.name);     // "Nicholas"

如果我們給基本類型添加屬性,將不會起作用

var name = "Nicholas";
name.age = 27;      // 不會報(bào)錯
alert(name.age);    // Undefined

復(fù)制變量值

如果從一個變量向另一個變量復(fù)制基本類型的值,會在變量對象上創(chuàng)建一個新值,然后把該值復(fù)制到為新變量分配的位置上。

var num1 = 5;
var num2 = num1;
num1 -= 1;
console.log(num2); // 5

對原來值的修改不會影響到新的值,同理對新值的修改也不會影響到原來的變量。

當(dāng)從一個變量向另一個變量復(fù)制引用類型的值時,也會將變量對象中的值復(fù)制一份給新變量,但這個值的副本實(shí)際上是一個指針,這個指針指向存儲在堆中的一個對象。兩個變量實(shí)際上將引用同一個對象。

var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicolas";
alert(obj2.name);   // "Nicolas"

改變其中一個變量,就會影響另外一個變量。

傳遞參數(shù)

ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。

為了證明對象是按值傳遞的,看例子:

function setName(obj) {
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);     // "Nicholas"

原來的obj指向person對象,并添加了一個name屬性。但第二行obj指向了一個新聲明的對象。如果參數(shù)是引用傳遞的,那么外部的person會指向這個新的對象,但從結(jié)果來看,person并沒有指向這個新的對象。

實(shí)際上,在函數(shù)內(nèi)部重寫obj時,這個變量引用的是一個局部對象,會在執(zhí)行完畢后被銷毀。

檢測類型

雖然在檢測基本類型時typeof是非常得力的助手,但在檢測引用類型的值時,這個操作符的用處不大。

為此,ECMAScript提供了instanceof操作符

判斷一個數(shù)組用instanceof,正則表達(dá)式也可以

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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