javascript面向?qū)ο蠹夹g(shù)基礎(chǔ)(二)
看了很多介紹javascript面向?qū)ο蠹夹g(shù)的文章,很暈.為什么?不是因?yàn)閷?xiě)得不好,而是因?yàn)樘願(yuàn)W.javascript中的對(duì)象還沒(méi)解釋清楚怎么回事,一上來(lái)就直奔主題,類/繼承/原型/私有變量。結(jié)果呢,看了大半天,有了一個(gè)大概的了解,細(xì)細(xì)一回味,好像什么都沒(méi)懂。
這篇文章是參考<<javascript-the definitive guide,5th edition>>第7,8,9章而寫(xiě)成的,我也會(huì)盡量按照原書(shū)的結(jié)構(gòu)來(lái)說(shuō)明javascript的面向?qū)ο蠹夹g(shù)(對(duì)象/數(shù)組->函數(shù)-->類/構(gòu)造函數(shù)/原型).對(duì)一些我自己也拿捏不準(zhǔn)的地方,我會(huì)附上原文的英文語(yǔ)句,供大家參考.
如果不做說(shuō)明,則文中出現(xiàn)的所有英文語(yǔ)句(程序體除外)都是引自<<javascript-the definitive guide,5th edition>>.
數(shù)組
我們已經(jīng)提到過(guò),對(duì)象是無(wú)序數(shù)據(jù)的集合,而數(shù)組則是有序數(shù)據(jù)的集合,數(shù)組中的數(shù)據(jù)(元素)通過(guò)索引(從0開(kāi)始)來(lái)訪問(wèn),數(shù)組中的數(shù)據(jù)可以是任何的數(shù)據(jù)類型.數(shù)組本身仍舊是對(duì)象,但是由于數(shù)組的很多特性,通常情況下把數(shù)組和對(duì)象區(qū)別開(kāi)來(lái)分別對(duì)(Throughout this book, objects and arrays are often treated as distinct datatypes.This is a useful and reasonable simplification; you can treat objects and arrays as separate types for most of your JavaScript programming.To fully understand the behavior of objects and arrays, however, you have to know the truth: an array is nothing more than an object with a thin layer of extra
functionality. You can see this with the typeof operator: applied to an array value, it returns the string "object". --section7.5).
創(chuàng)建數(shù)組可以用"[]"操作符,或者是用Array()構(gòu)造函數(shù)來(lái)new一個(gè).
Js代碼
- var array1 = []; //創(chuàng)建空數(shù)組
- var array2 = new Array(); //創(chuàng)建空數(shù)組
- array1 = [1,"s",[3,4],{"name1":"NAME1"}]; //
- alert(array1[2][1]); //4 訪問(wèn)數(shù)組中的數(shù)組元素
- alert(array1[3].name1); //NAME1 訪問(wèn)數(shù)組中的對(duì)象
- alert(array1[8]); //undefined
- array2 = [,,]; //沒(méi)有數(shù)值填入只有逗號(hào),則對(duì)應(yīng)索引處的元素為undefined
- alert(array2.length); //3
- alert(array2[1]); //undefined
用new Array()來(lái)創(chuàng)建數(shù)組時(shí),可以指定一個(gè)默認(rèn)的大小,其中的值此時(shí)為undefined,以后可以再給他們賦值.但是由于javascript中的數(shù)組的長(zhǎng)度是可以任意改變的,同時(shí)數(shù)組中的內(nèi)容也是可以任意改變的.
因此這個(gè)初始化的長(zhǎng)度實(shí)際上對(duì)數(shù)組沒(méi)有任何的約束力.對(duì)于一個(gè)數(shù)組,如果對(duì)超過(guò)它***長(zhǎng)度的索引賦值,則會(huì)改變數(shù)組的長(zhǎng)度,同時(shí)會(huì)對(duì)沒(méi)有賦值的索引處賦值undefined,看下面的例子.
Js代碼
- var array = new Array(10);
- alert(array.length); //10
- alert(array[4]); //undefined
- array[100] = "100th"; //這個(gè)操作會(huì)改變數(shù)組的長(zhǎng)度,同時(shí)將10-99索引對(duì)應(yīng)的值設(shè)為undefined
- alert(array.length); //101
- alert(array[87]); //undefined
可以用delete操作符刪除數(shù)組的元素,注意這個(gè)刪除僅僅是將數(shù)組在該位置的元素設(shè)為undefined,數(shù)組的長(zhǎng)度并沒(méi)有改變.我們已經(jīng)使用過(guò)了數(shù)組的length屬性,length屬性是一個(gè)可以讀/寫(xiě)的屬性,也就是說(shuō)我們可以通過(guò)改變數(shù)組的length屬性來(lái)任意的改變數(shù)組的長(zhǎng)度.如果將length設(shè)為小于數(shù)組長(zhǎng)度的值,則原數(shù)組中索引大于length-1的值都會(huì)被刪除.如果length的值大于原始數(shù)組的長(zhǎng)度,則在它們之間的值設(shè)為undefined.
Js代碼
- var array = new Array("n1","n2","n3","n4","n5"); //五個(gè)元素的數(shù)組
- var astring = "";
- for(var i=0; i<array.length; i++) { //循環(huán)數(shù)組元素
- astring += array[i];
- }
- alert(astring); //n1n2n3n4n5
- delete array[3]; //刪除數(shù)組元素的值
- alert(array.length + "_" + array[3]) //5_undefined
- array.length = 3; //縮減數(shù)組的長(zhǎng)度
- alert(array[3]); //undefined
- array.length = 8; //擴(kuò)充數(shù)組的長(zhǎng)度
- alert(array[4]); //undefined
對(duì)于數(shù)組的其他方法諸如join/reverse等等,在這就不再一一舉例.
通過(guò)上面的解釋,我們已經(jīng)知道,對(duì)象的屬性值是通過(guò)屬性的名字(字符串類型)來(lái)獲取,而數(shù)組的元素是通過(guò)索引(整數(shù)型 0~~2**32-1)來(lái)得到值.數(shù)組本身也是一個(gè)對(duì)象,所以對(duì)象屬性的操作也完全適合于數(shù)組.
【編輯推薦】
- javascript面向?qū)ο蠹夹g(shù)基礎(chǔ)(一)
- Javascript中閉包的作用域鏈
- 讓瀏覽器非阻塞加載javascript的幾種方式
- Javascript解決瀏覽器兼容性問(wèn)題