Javascript數組小結

Javascript 數組小結
  1. Javascript將指定的數字索引值轉換成字符串——索引值1變成「1」——而後將其做爲屬性名來使用。編程

  2. 數組的length修改後,數組中大於設定值的元素將被刪除數組

  3. 數組的添加刪除:瀏覽器

    1)  修改length屬性值(刪除)ide

    2)  pushpop在數組的尾部進行插入、刪除操做並返回操做元素;unshiftshift()在數組的首部進行插入、刪除操做函數式編程

    3)  delete能夠刪除數組元素,但它不會改變數組的length屬性,只是將該值置空。函數

    4)  splice()是一個通用的方法來插入,刪除或替換數組元素。this

4.Object.keys(obj):獲取對象全部鍵值spa

5.遍歷數組須要注意的問題prototype

    1)  排除nullundefined和不存在元素對象

    for(var i=0;i<arr.length;i++){

       if(!arr[i]) continue;

    //循環體

    }

    2)  只排除undefined和不存在元素

    for(var i=0;i<arr.length;i++){

       if(arr[i]===undefined) continue;

    //循環體

    }

    3)  只想跳過不存在元素,而仍然要處理存在的undefined元素

    for(var i=0;i<arr.length;i++){

       if(!(i in a))  continue;

    //循環體

    }

    4)  還可使用for/in循環處理稀疏數組,循環每次將一個可枚舉的屬性名(包括數組索引)賦值給循環變量。不存在的索引將不會遍歷到,然而for/in循環可以枚舉繼承的屬性名,如加到Array.prototype中的方法。因爲這個緣由,在數組上不該該使用for/in循環,除非使用額外的檢測方法來過濾不想要的屬性。

    for(var i in arr){

       if(!arr.hasOwnProperty(i))continue;//跳過繼承屬性

       //循環體

    }

    for(var i in a){

       //跳過不是非負整數的i

    if(String(Math.floor(Math.abs(Number(i))))!==i)continue;

       //循環體

    }

    5)  ECMAScript5還定義了其餘遍歷方式

    Data.forEach(function(c){

    //處理程序

    }

6.數組的經常使用方法

    1)  Array.join(分隔符)String.split(分隔符),按指定的分隔符將數組轉換爲字符串,或者相反

    2)  Array.reverse()將數組中的元素顛倒順序,返回逆序數組。它是在原數組上進行操做的。

    3)  Array.sort()將數組中的元素排序並返回排序後的數組。當不帶參數調用sort()時,數組元素以字母表順序排序(若有必要將臨時轉化爲字符串進行比較),若是數組中包含undefined元素,他們會被排到數組的尾部。爲了按照其餘方式而非字母表順序進行數組排序,必須給sort()方法傳遞一個比較函數。該函數決定了它的兩個參數在排好序的數組中的前後順序。假設第一個參數應該在後,函數應該返回一個大於0的數值。而且,假設兩個值相等(也就是說,他們的順序可有可無),函數應該返回0,所以,例如,用數值大小而非字母表順序進行數組排序,代碼以下:

    var a=[33,4,1111,22];

    a.sort();//字母表順序:1111,222,33,4

    a.sort(function(a,b){//數值順序:4,33,222,1111

    return a-b;//根據順序,返回負數,0,正數

    });

    a.sort(function(a,b){return b-a;});

    另外一個數組元素排序的例子,也許須要對字符串數組執行不區分大小寫的字母表排序,比較函數首先將參數轉換爲小寫字符串,在開始比較。

    4)  Array.concat()方法建立並返回一個新數組,它的元素包括調用concat()的原始數組的元素和concat()的每一個參數。若是這些參數中的任何一個自身是數組,則鏈接的是數組的元素,而非數組自己。但要注意,concat()不會遞歸扁平化數組的數組。concat也不會修改調用的數組。

    var a=[1,2,3];

    a.concat(4,5) //返回[1,2,3,4,5]

    a.concat([4,5]) //返回[1,2,3,4,5]

    a.concat([4,5],[6,7]) //返回[1,2,3,4,5,6,7]

    a.concat(4,[5,[6,7]]) //返回[1,2,3,4,5,[6,7]]

    5)  Array.slice()方法返回指定數組的一個片斷或子數組。它的兩個參數分別指定了片斷的開始和結束的位置。返回的數組包含第一個參數指定的位置和全部和全部到但不包含第二個參數指定的位置之間的全部數組元素。若是隻指定一個參數,返回的數組將包含從開始位置到數組結尾的全部元素。若是參數中出現負數,它表示相對於數組中最後一個元素的位置。該函數不對原數組進行操做。

    6)  Array.splice():方法是在數組中插入或刪除元素的通用方法。不一樣於slice()和concat(),splice()會修改調用數組。splice()可以從數組中刪除元素、插入元素到數組中或者同時完成這兩種操做。egarr.splice(2,2,[1,2],3];//2位置刪除兩個元素,並添加[1,2],3兩個元素。

    7)  Array.push()、Array.pop():在數組尾部添加(能夠爲多個,數組當總體對待)、刪除一個元素。

    8)  Array.unshift()Array.shift():在數組頭部插入(能夠爲多個,當有多個元素時會總體對待)、刪除元素。

    9)  toString()和toLocaleString():主要區別在於後者會受本地控制面板裏設置的時區的影響。

7.ECMAScript5中數組的方法

    1)  Array.forEachvalue,index,arr:遍歷數組中的每一個元素,參數依次是遍歷中數組的值,數組索引、數組。這個函數的缺點是沒法在全部元素都傳遞給調用的函數以前終止遍歷。

    2)  Array.map():方法將調用的數組的每一個元素傳遞給指定的函數,並返回一個新數組,它包含該函數的返回值。map()返回的是新數組,它不修改調用的數組。若是是稀疏數組,返回的也是相同方式的稀疏數組:他們有相同的長度,相同的缺失元素。

    3)  Array.filter()方法返回的數組是調用的數組的一個子集。傳遞的函數時用來邏輯斷定的:該函數返回truefalse。調用斷定函數就像調用forEach()和map()同樣。若是返回值爲true或能轉化爲true的值,那麼傳遞給斷定函數的元素就是這個子集的成員,它將添加到一個做爲返回值的數組中。注意,filder()會跳過稀疏數組中缺乏的元素,它的返回數組是稠密的。所以能夠用來壓縮稀疏數組,

    var dese=sparse.filter(function(){return true;});

    4)  Arrary.every()Array.some()是數組的邏輯斷定:他們對數組元素應用指定的函數進行斷定,返回truefalse,前者全部的爲真,才爲真,後者存在一個元素知足條件即返回真。

    5)  reduce()reduceRight():方法使用指定的函數將數組元素進行組合,生成單個值。這在函數式編程中是常見的操做,也能夠稱爲「注入」和「摺疊」。舉例說明它是如何工做的:

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

    var sum=a.reduce(function(x,y){return x+y;},0):數組求和

    var product=a.reduce(function(x,y){return x*y;}1):數組求積

    var max=a.reduce(function(x,y){return (x>y)?x:y;});

    reduce須要兩個參數,第一個執行化簡操做的函數。化簡函數的任務就是用某組方法把兩個值組合或化簡爲一個值,並返回化簡後的值。在上述例子中,函數經過加法,乘法或取最大值的放大組合兩個值。第二個(可選)的參數是一個傳遞給函數的初始值。第一個參數是到目前爲止的化簡操做累積的結果。第一次調用函數時,第一個參數是一個初始值,它就是傳遞給reduce的第二個參數。在接下來的調用中,這個值就是上一次化簡函數的返回值。在上面的第一個例子中,第一次調用化簡函數時的參數是01。將二者相加並返回1。將二者相加並返回1.再次調用時的參數是12,它返回3。而後它計算3+3=66+4=10,最後計算1+5=15.最後的值是15reduce返回這個值。

    可能已經注意到了,上面三次調用reduce()時只有一個參數:沒有指定初始值。當不指定初始值調用reduce()時,它將使用數組的第一個元素做爲其初始值。這意味着第一次調用化簡函數就使用了第一個和第二個數組元素做爲其第一個和第二個參數。在上面求和與求積的例子中,能夠省略初始值參數。

    在空數組上,不帶初始值參數調用reduce()將致使類型錯誤異常。若是調用它的時候只有一個值——數組只有一個元素而且沒有指定初始值,或者有一個空數組而且指定一個初始值——reduce只是簡單地返回那個值而不會調用化簡函數。

    reduceRight()的工做原理和reduce同樣,不一樣的是,它按照數組索引從高到低(從右到左)處理數組,而不是從低到高。若是化簡操做的優先順序是從左到右,你可能想使用它,例如:

    var a=[2,3,4]

    //計算2^(3^4).乘方操做的優先順序是從右到左

    varbig=a.reduceRigth(functionaccumulator,value{

    returnMath.pow(value,accumulator);

    });

    注意,reduce()和reduceRight()都能接收一個可選的參數,它指定了化簡函數調用時的this關鍵字的值。可選的初始值參數仍然須要佔一個位置。若是想化簡函數做爲一個特殊對象的方法調用,請參看Function.bind()方法。

    值得注意的是,上面描述的every()和some()方法是一種類型的數組化簡操做。可是不一樣的是,他們會盡早終止遍歷而不老是訪問每個數組元素。

    爲了簡單起見,到目前爲止,所展現的勵志都是數值的,但數學計算不實reduce()和reduceRight()的惟一意圖。

    6)  indexOf()和lastIndexOf():搜索整個數組中具備給定值的元素,返回找到的第一個元素的索引或者若是沒有找到就返回-1indexOf()從頭到尾搜索,而lastIndexOf()則按相反方向的搜索,這兩個函數不接受一個函數做爲其參數。第一個參數是須要搜索的值,第二個參數是可選的:它指定數組中的一個索引,從哪裏開始搜索,若是省略該參數,indexOf()從頭開始搜索。而lastIndexO()從末尾開始搜索,第二個參數也能夠是負數,它表明相對數組末尾的偏移量。 

8.ECMAScript5能夠經過Array.isArray()函數來判斷對象是否爲數組。eg

Array.isArray([])://true

Array.isArray({})false

ECMAScript5之前,要區分數組和非數組是很是困難的。typeof操做符在這裏幫不上忙,對數組它返回「對象「(而且對於除了函數之外的全部對象都是如此)。instanceOf操做符只能用於簡單的情形。

[] instanceof Array //true

({}) instanceof Array //false

使用instanceof的問題是在Web瀏覽器中有可能有多個窗口或窗體(frame)存在。每一個窗口都有本身的Javascript環境,有本身的全局對象。而且,每一個全局對象有本身的一組構造函數。所以一個窗體中的對象將不多是另外窗體的實例。窗體之間的混淆不常發生,但這個問題足以證實instanceOf操做符不能視爲一個可靠的數組檢測方法。

解決方法是檢查對象的類屬性。對數組而言該屬性的值老是Array,所以在ECMAScript3isArray()函數的代碼能夠這樣寫:

var isArray=Function.isArray||function(o){

return typeof o===」object」&&

Object.prototype.toString.call(o)==」[object Array]」;

};

//(此處曾經是BAT的考點)

實際上,此處類屬性的檢測就是ECMAScript5Array.isArray()函數所作的事情。

9.數組的特性:

    1)  當有新的元素添加到列表中時,自動更新length屬性

    2)  設置length爲一個較小值將截斷數組

    3)  Array.prototype中繼承一些有用的方法

    4)  其類屬性爲「Array

10.Javascript數組方法是特地定義爲通用的,所以它們不只應用在真正的數組並且在類數組對象上都能正確工做。在ECMAScript5中,全部的數組方法都是通用的。在ECMAScript3中,除了toString()和toLocaleString()之外的全部方法也是通用的。(concat()方法是一個特例,雖然能夠用在類數組對象上,但它沒有將那個對象擴充進返回的數組中。)既然類數組對象沒有繼承自Array.prototype,那就不能再它們上面直接調用數組方法。儘管如此,能夠間接地使用Function.call方法調用:

vara={'0':'a','1':'b','2':'c',length:3};

Array.prototype.join(a,'+');

console.log(Array.prototype.join.call(a,'+'));

console.log(

         Array.prototype.map.call(a,

                   function(x){

                            returnx.toUpperCase();

                   }

));

11.做爲數組的字符串:在ECMAScript5(在衆多最近的瀏覽器實現——包括IE8——早於ECMAScript5)中,字符串的行爲相似於只讀的數組。除了用charAt()方法來訪問單個字符串之外,還可使用方括號:

var t='test';

console.log(t.charAt(0));//"t"

console.log(t[1]);//"e"

可索引的字符串的最大好處就是簡單,字符串的行爲相似於數組的事實使得通用的數組方法能夠應用到字符串上。例如:

var t='test';

console.log(Array.prototype.join.call(t,''));//t e s t

須要注意的是:字符串是不可變值,故當把它們做爲數組看待時,他們是隻讀的。如push()、sort()、reverse()和splice()等數組方法會修改數組,它在字符串上是無效的。不只如此,使用數組方法來修改字符串會致使錯誤,出錯的時候沒有提示。

相關文章
相關標籤/搜索