以下內(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、Boolean、Number和String
引用類型值指那些可能由多個值構(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á)式也可以