JavaScript的數組(一)
在JavaScript中,對象,數組,函數是最最常用的東東了,寫完了對象和函數,最後來說說數組吧,提到數組,就只能想到,map,forEach啊,pop,push啊,當真是沒有一點點的積累了?這麽多年程序媛當真是就只學會了for循環了,人生如此美妙,你卻如此淺薄無知啊,可惜啊可惜!如果你當真認為是這樣,你就是個笨蛋啦。廢話不多說,幹貨走起!
首先,說下數組元素可以是任意類型的,索引是從零開始的,數組可能是稀疏的,即數組元素的索引不一定是要連續的哦,中間可以有空缺的呦。那麽數組的length針對於稀疏數組,length大於所有元素個數的和。
數組呢,是對象的特殊形式,所以它的索引實際上和碰巧是整數的屬性名差不多。但是,用數字索引來訪問數組元素一般來說要比訪問常規的對象屬性要快很多。
數組繼承自Array.prototype中的屬性。
1,創建數組
這裏說一種不常見的創建方式
var undefs = [,,] undefined undefs (2) [empty × 2]
var a = new Array(); var b = new Array(10); var c = new Array(1,2,3,4,‘thank you‘)
javascipt將指定的數字索引值轉換成字符串----索引值1變成“1”,然後將其作為屬性名來使用
var o = {};
o[1] = "one";
數組的特殊之處在於,根據需要更新他們的length屬性值。
註意:可以使用負數或非整數來索引數組。事實上數組索引僅僅是對象屬性名的一種特殊類型。
2,稀疏數組,length
即包含從0開始的不連續索引的數組。
var a = new Array(5); a[1000] = 0; 0 a (1001) [empty × 1000, 0]
length一個特殊之處在於,看下面的例子:
var a = [1,2,3,4,5]; a.length = 3; 3 a (3) [1, 2, 3] a.length = 0 0 a [] a.length = 5 5 a (5) [empty × 5]
3:數組的添加和刪除
arr.push(‘one‘,‘two‘);//尾部插入
arr.unshift() //首部插入
delete a[1] //刪除操作不影響數組原來的長度,刪除後原數組變成了稀疏數組。
pop()//尾部刪除一個元素
shift()//頭部刪除一個元素
splice() 是一個通用的插入,刪除,替換操作數組的方法。
4數組的遍歷
常用for循環,不能用for/in循環去檢測數組,因為for/in循環能夠枚舉繼承的屬性名,如添加到Array.prototype中的方法。除非用額外的檢測方法來過濾不想要的屬性。
5.數組的方法:
join(),reverse(),sort(),concat(),slice(),splice()
toString()
新的數組方法來遍歷,映射,過濾,檢測,簡化和搜索數組。
every()和some()不總是訪問每一個數組元素,如果有fasle就會盡早終止遍歷。
var a = [2,12,3,5,6]; a.forEach(function(v,i,a){a[i] = v+1}) a.map(function(x){return x*x}); a.filter(function(x){return x<3}) //返回的數組元素是調用的數組的一個子集。 a.every(function(x){return x<10}) //所有的值都<10 a.some(function(x){return x<10}) //存在有小於10的數就是true
重點來說說不常用的reduce函數:
var sum = a.reduce(function(x,y){return x+y},0); 需要兩個參數,first one is 一個函數,任務就是用某種方法把兩個值化簡為一個值,並返回簡化後的值,第二個參數是傳遞給函數的初始值。在例子中,第一次調用化簡函數時的參數是0和2,相加後返回2,第二次調用時參數是2和12,返回14,每次都是將上一次計算返回值和數組下一個進行計算。最後reduce()返回這個值。 當不指定初始值調用reduce()時,它將數組的第一個元素作為其初始值。上面的求和例子就可以省略初始值的設定。 空數組調用reduce函數會報錯!!! reduceRight()的工作原理類似reduce(),不同之處在於:是按照數組的索引從高到低(從由到左)處理數組的。例如計算:2^(3^4);就是從右到左進行計算求值的。var a = [2,3,4]; var result = a.reduceRight(function(x,y){ return Math.pow(y,x); })
這裏的union函數自己寫的,運行下貌似沒問題,可以合並對象屬性:
var objects = [{x:1},{y:2},{z:3}]; function union(x,y){ for(var i in y){ i in x ? null : x[i] = y[i]; } return x; } var merged = objects.reduce(union);
最後一個方法:indexOf()和lastIndexOf(),裏面傳值都是要檢索的字段,沒有就返回-1,有就返回索引,一個從前往後查找,一個從後往前查找。沒啥說的。本篇結束!!!
JavaScript的數組(一)