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])
})
复制代码
相关文章
相关标签/搜索