Javascript數組詳解

靜態成員

  • from:將僞數組轉換爲真數組
let args = Array.from(arguments);
複製代碼
  • isArray 判斷給定的數據是否是真數組(真數組:經過Array構造器構造的數組)
  • of Array.of()與new Array()的區別,若是隻有一個參數n,前者表示數組只有一位,值爲n;後者表示建立一個長度爲n的空數組

實例成員

會改變原數組數組

  • fill 填充數組,將數組的指定區間的值換爲某個固定值 fill(val,a,b); // fill with val from position a until position b
  • pop 刪除數組的最後一位並返回
  • push 在數組末尾新增一個元素並返回數組長度
  • reverse 將數組顛倒順序
  • shift 刪除數組的第一個元素並返回
  • unshift 將一個或多個元素添加到數組的開頭,並返回該數組的新長度
  • sort 排序
  • splice splice(n1,n2,a,b,c...) 從第 n1 位開始刪除 n2 個元素,插入a , b, 和 c ...

不會改變原數組bash

  • concat var newArr = arr1.concat(arr2,arr3...) 返回連接後的新數組
  • includes 是否包含知足條件的元素 arr.includes(val,n) 第二顆參數可傳可不穿,表示從下標爲n的位置開始,是否包含val(嚴格比較)
  • join 將一個數組(或一個類數組對象)的全部元素鏈接成一個字符串並返回這個字符串。若是數組只有一個項目,那麼將返回該項目而不使用分隔符。若是省略參數,數組元素用逗號分隔。默認爲 ","
  • slice 返回一個新的數組對象,這一對象是一個由 begin 和 end 決定的原數組的淺拷貝(包括 begin,不包括end)。
  • toString 返回一個表示該對象的字符串。
  • indexOf 返回在數組中能夠找到一個給定元素的第一個索引,若是不存在,則返回-1。
  • lastIndexOf 返回在數組中能夠找到一個給定元素的最後一個索引,若是不存在,則返回-1。

迭代方法

  • forEach
//forEach 不會改變原數組 返回undefined 不容許中途break
        let arr = [1,2,3,4,5];
        arr.forEach(function (val,index) { //若是有第三個參數,此參數爲該數組
            console.log(val,index);
         })

         //
         Array.prototype.myForEach = function(func){
            for(let i = 0; i < this.length; i++){
                func(this[i],i);
                // return ;
            }
         }
複製代碼
  • every 判斷數組的全部元素是否都知足條件(返回true/false)
var arr = [2,3,4,-1];
    var noZero = arr.every(function(val,index,arr){
        return val !== 0;
    })
複製代碼
  • some 判斷數組中是否有元素知足條件(只要又一個知足就返回true)
var arr = [1,2,3,-1];
    var negative = arr.some(function(val,index,arr){
        return val < 0;
    })
複製代碼
  • filter 過濾器
// filter 篩選 返回新的數組
        var arr = [1,2,3,4,5];
        var newArr = arr.filter(function (val,index) { 
            return val >= 2;
         })
         console.log(newArr);

         Array.prototype.myFilter = function (func) { 
             let len = this.length,
                newArr = [];
             for(let i = 0;i < len; i++){
                if(func(this[i],i))
                    newArr.push(this[i]);
             }
             return newArr;
          }
          var myArr = arr.myFilter(function(val,index){
                return val > 2;
          })
          console.log(myArr);
複製代碼
  • find 查找第一個知足條件的元素,返回元素自己,若是沒有找到,返回undefined
var person = [{
        name:'a',
        age:17,
    },
    {
        name:'b',
        age:18,
    },
    {
        name:'c',
        age:19,
    }];
    var findAdult = person.find(function(val,item){
        return val.age >= 18;
    });
    //findAdult : {name: "b", age: 18}
複製代碼
  • findIndex 查找第一個知足條件的元素,返回元素下標,若是沒有找到,返回-1
var person = [{
        name:'a',
        age:17,
    },
    {
        name:'b',
        age:18,
    },
    {
        name:'c',
        age:19,
    }];
    var findAdult = person.findIndex(function(val,item){
        return val.age >= 18;
    });
    //findAdult : 1
複製代碼
  • map 映射
//map返回在原數組基礎上修改後的數組
        var arr = [1,2,3,4,5];
        var newArr = arr.map(function (val,index) { 
            return val*2;
         })
        console.log(newArr);

        Array.prototype.myMap = function (func) { 
            let len = this.length,
                newArr = [];
                for(let i = 0; i < len; i++){
                    newArr.push(func(this[i],i));//這裏須要deepclone!!!!
                }
            return newArr;
         }
         var myArr = arr.myMap(function(val, index){
             return val*2;
         })
         console.log(myArr);
複製代碼
  • reduce 對數組中的每一個元素執行一個由您提供的reducer函數(升序執行),將其結果彙總爲單個返回值。
//reduce 從左向右迭代整個數組 作累加器 只會返回最後一個值
        var arr = [1,2,3,4,5];
        arr.reduce(function (preValue, val, index) { //preVal 上一次執行函數return 的值 
            console.log(preValue);
            console.log(index+":"+val);
            return val;
         })//初始值,在第一次執行函數時preVal的值,若是不傳默認值,preValue會從數組的第一位開始,val從第二位開始

         var sum = arr.reduce(function (preVal, val, index) { 
             return preVal + val;
          })
          console.log(sum);

          Array.prototype.myReduce = function(func,init){
            var preVal = init,k = 0;
            if(init === undefined){
                preVal = this[0];
                k = 1;
            }
            for(k; k < this.length;k++){
                preVal = func(preVal,this[k],k);
            }
            return preVal;
          }
          var mySum = arr.myReduce(function(preVal, val, index){
              return preVal + val;
          });
          console.log(mySum);
複製代碼
  • reduceRight 接受一個函數做爲累加器(accumulator)和數組的每一個值(從右到左)將其減小爲單個值。
var arr = [1,2,3,4,5];
    var sum = arr.reduceRight(function (preVal, val, index) { 
        console.log(index);
        return preVal + val;
     },0);
     console.log(sum);

     Array.prototype.myReduceRight = function(func,init){
        var preVal = init,k = this.length-1;
        if(init === undefined){
            preVal = this[k];
            k--;
        }
        for(k; k >= 0; k--){
            preVal = preVal = func(preVal,this[k],k);
        }
        return preVal;
     }
     var mySum = arr.myReduceRight(function(preVal ,val,index) {
         console.log(index);
         return preVal + val;
     },0);
     console.log(mySum);
複製代碼

for in和for of的區別

遍歷數組一般使用for循環,ES5的話也可使用forEach,ES5具備遍歷數組功能的還有map、filter、some、every、reduce、reduceRight等,只不過他們的返回結果不同。可是使用foreach遍歷數組的話,使用break不能中斷循環,使用return也不能返回到外層函數。函數

Array.prototype.method=function(){
        console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="數組"
for (var index in myArray) {
  console.log(myArray[index]);
}
複製代碼

使用for in 也能夠遍歷數組,可是會存在如下問題: 1.index索引爲字符串型數字,不能直接進行幾何運算ui

2.遍歷順序有可能不是按照實際數組的內部順序this

3.使用for in會遍歷數組全部的可枚舉屬性,包括原型。例如上慄的原型方法method和name屬性spa

因此for in更適合遍歷對象,不要使用for in遍歷數組。prototype

那麼除了使用for循環,如何更簡單的正確的遍歷數組達到咱們的指望呢(即不遍歷method和name),ES6中的for of更勝一籌.code

Array.prototype.method=function(){
    console.log(this.length);
}
var myArray=[1,2,4,5,6,7]
myArray.name="數組";
for (var value of myArray) {
  console.log(value);
}
複製代碼

記住,for in遍歷的是數組的索引(即鍵名),而for of遍歷的是數組元素值。對象

for of遍歷的只是數組內的元素,而不包括數組的原型屬性method和索引name排序

遍歷對象 一般用for in來遍歷對象的鍵名

Object.prototype.method=function(){
    console.log(this);
}
var myObject={
    a:1,
    b:2,
    c:3
}
for (var key in myObject) {
  console.log(key);
}
複製代碼

for in 能夠遍歷到myObject的原型方法method,若是不想遍歷原型方法和屬性的話,能夠在循環內部判斷一下,hasOwnPropery方法能夠判斷某屬性是不是該對象的實例屬性

for (var key in myObject) {
    if(myObject.hasOwnProperty(key)){
        console.log(key);
    }
}
複製代碼

一樣能夠經過ES5的Object.keys(myObject)獲取對象的實例屬性組成的數組,不包括原型方法和屬性。

Object.prototype.method=function(){
    console.log(this);
    }
var myObject={
        a:1,
        b:2,
        c:3
    }
Object.keys(myObject).forEach(function(key,index){&emsp;&emsp;
    console.log(key,myObject[key])
})
複製代碼
相關文章
相關標籤/搜索