重溫《js權威指南》 第7,8章

2022-07-15 09:12:12 字數 4159 閱讀 4582

第七章 陣列

陣列是值的有序集合。js陣列是無型別的,陣列元素可以是任意型別,同乙個陣列中不同元素也可能有不同的型別。陣列可以動態增長或縮減,建立時無須生命那個乙個固定的大小並且陣列大小變化時也無須重新分配空間。

js陣列可能是稀疏的:陣列的索引不一定連續。針對稀疏陣列,陣列的length屬性可能不管用。

陣列索引實際上和碰巧是整數的屬性名差不多,但是有些特殊的優化,比訪問常規的物件屬性要快很多。

7.1 建立陣列

陣列直接量建立。

var empty=;

var primes=[1,2,3,4];

var misc=[1.1,true,'a'];

var b=[[1,],[2,]];

var count=[1,,3]//長度為三

var speccount=[,,]//因為陣列允許有可選的逗號做結尾,所以長度為2

呼叫建構函式array()建立陣列

var a=new array();

var b=new array(10);

var c=new array(1,2,3);

7.2 陣列元素的讀和寫

使用 讀寫

var a=["world"];

var value=a[0];

a[1]=3.14;

i=2;

a[i]=3;

a[i+1]="hello";

a[a[i]]=a[0];

陣列是物件的特殊形式。使用方括號訪問陣列元素就像用方括號訪問物件的屬性一樣。js將指定的數字索引值轉換成字串——索引值1變成"1"——然後將其作為屬性名來使用

清晰地區分陣列的索引和物件的屬性名是非常有用的。所有的索引都是屬性名,但只有在0~232-2之間的整數屬性名才是索引。所有的陣列都是物件,可以為其建立任意名字的屬性。但如果使用的屬性是陣列的索引,則陣列會特殊的維護它的屬性length

js陣列沒有「越界的概念」,訪問沒有的物件時,返回undefined

7.3 稀疏陣列

跟正常的陣列有一些區別,但更像是有一些undefined值的陣列

var a=new array(5);//length=5

var b=;//長度為0

b[1000];//長度為1001

var  a1=[,,,];

var  a2=new arrays(3);

alert(0 in a1)//true;

alert(0 in a2)//false;

7.4 陣列長度

陣列的length是陣列與js普通物件的區別。陣列的length一定大於等於陣列的長度(存在稀疏陣列)

當插入資料時,length+1;

當length比陣列的長度小時,陣列會刪除多於length索引的陣列值

var a=[1,2,3,4,5,];

a.length=3;//a[1,2,3]

alert(a[4]);//undefined

a.length=5;

alert(a[4]);//undefined

7.5 陣列元素的新增和刪除

var a=; //空陣列

a[0]='0';//新增乙個元素

a.push("zero");//在末尾新增元素

a.push("two","three");//在末尾新增多個元素

//**********===刪除分界線***************===

a=[1,2,3];

delete a[1];

1 in a;//false

a.length//3   delete操作不會修改length

7.6 陣列遍歷

使用for迴圈

使用for/in迴圈處理稀疏陣列(不推薦,因會遍歷array.prototype所有的屬性)

ecmascript 5定義了一些遍歷陣列元素的新方法,如foreach()

var data=[1,2,3,4,5];

var sumofsquares=0;

data.foreach(function(x)()); //直接定義的函式會立即呼叫

8.6 閉包

函式物件可以通過作用域鏈相互關聯起來,函式體內部的變數都可以儲存在函式作用域內。

理解閉包,就是理解:「函式定義時的作用域鏈到函式執行時依然有效」

從技術角度上說,所有的js函式都是閉包:它們都是物件,它們都關聯到作用域鏈。定義大多數函式時的作用域鏈在呼叫函式時仍然有效,但這並不影響閉包。當呼叫函式時,閉包所指向的作用域鏈和定義函式時的作用域鏈不是同乙個作用域鏈時,會很有意思。

當乙個函式巢狀了另外乙個函式,外部函式將巢狀的函式物件作為返回值返回的時候往往會發生這種事。

var scope="global scope";             

function checkscope()

checkscope();//"local scope"

var scope="global scope";

function checkscope()

checkscope()();//"local scope"

js函式的執行用到了作用域鏈,這個作用域鏈是函式定義的時候建立的。巢狀的函式f()定義在這個作用域鏈裡,其中的變數scope一定是區域性變數,不管在何時何地執行函式f(),這種繫結在執行f()時依然有效:函式定義時的作用域鏈到函式執行時依然有效。
實現閉包

我們將作用域鏈描述為乙個物件列表,不是繫結的棧。每次呼叫js函式的時候,都會為之建立乙個新的物件用來儲存區域性變數,把這個物件新增至作用域鏈中。當函式返回的時候,就從作用域鏈中將這個繫結變數的物件刪除。如果不存在巢狀的函式,也沒有其他引用指向這個繫結物件,它就會被當做垃圾**掉。如果定義了巢狀的函式,每個巢狀的函式都各自對應乙個作用域鏈,並且這個作用域鏈指向乙個變數繫結物件。如果這些巢狀的函式物件沒有在外部函式中儲存下來,那麼它們也會和所指向的變數繫結物件一樣當作垃圾**。但是如果這個函式定義了巢狀的函式,並將它作為返回值返回或者儲存在某處的屬性裡,這時會有乙個外部引用指向這個巢狀的函式。它就不會被當作垃圾**,並且它所指向的變數繫結物件也不會被當作垃圾**

///原uniqueinteger,容易被重置或汙染counter

uniqueinteger.counter=0;

function uniqueinteger=(function();

///閉包內多個巢狀函式共享變數

function counter(),

reset:function()

var b=counter();

var c=counter();

console.log('b:'+b.count());//0

console.log('c:'+c.count());//0    互不影響

console.log('b:'+b.count());

console.log('c reset:'+c.reset());

console.log('c:'+c.count());//0  reset  count  共享

8.7 函式屬性、方法和建構函式

8.7.1 length屬性

arguments.length 表示 傳入函式的實參的個數

function.length 表示  定義函式時期望的實參個數

8.7.2 prototype屬性

每個函式都包含乙個prototype屬性,這個屬性指向乙個物件的引用,稱作原型物件。

f.cal(o)    等價於     o.m=f;

o.m();

delete o.m;             

8.7.4 bind()

8.8 函式式程式設計

1.高階函式

2.不完全函式

3.記憶            

重溫《js權威指南》 第2 3章

第二章 語法結構 2.1 js區分大小寫,html不區分大小寫 2.5 注意分號,如果沒有分號,直譯器會試 析js,並在不能解析的地方加分號 第三章 值和變數 js資料型別分兩類 原始型別 數字,字串,布林值 和物件型別。兩個特殊的原始值 undefined,null 3.1 數字 js不區分整型和...

HTTP權威指南(7,8章)

快取 優點 1.減少了冗餘的資料傳輸,節省了網路費用 2.緩解了網路瓶頸,不需要更多的頻寬就能更快的載入頁面 3.降低了隊員是伺服器的要求,伺服器可以更快的響應,避免過載的出現 4.降低了距離時延 http 1.1 cache control max age 秒 if modified since ...

筆記 《js權威指南》 第6章 物件

1.屬性的特性 可寫性,可遍歷,可刪除修改屬性。2.物件的特性 1 物件的原型prototype,本物件的屬性繼承自它的原型物件。2 物件的類class,是乙個標識物件型別的字串。3 ecmscript 5中 物件的擴充套件標記指明了是否可以給該物件新增新屬性。3.物件的型別 1 內建物件 由ecm...