数组是一个有序的集合,javascript数组中的元素的类型可以是任意的,同一个数组不同元素之间的类型也是可以不同的。数组也是对象,有个length属性,记录数组的长度。

  1. 创建数组
    有两种方法:
      数组直接量,var arr = [1,2,];这样会创建一个有两个元素的数组。之所以不是3个元素,是因为最后一个逗号是可选的。
      另外一种是调用构造函数:
          var arr = new Array(10);这样会创建一个具有10个元素的数组;或者
              var arr = new Array(1,2,3,4,5,6);直接传进数组元素
      
  2. 数组元素的读写
    数组是特殊的对象,数组特殊在维护了一个length属性。数组的索引其实也就是对象的属性,0--2`32-2的属性值是索引。0--2`32-2的索引会自动转化为字符串的属性值。如下:
    var a = [1,2];
    console.log(a.[0])//1

    数组是对象,这因为着可以给它添加属性:

    var a = [];
    a.test = 'test';
    console.log(a.length);
    a['0'] = 3;
    console.log(a.length);
    console.log(a.test);//test
    console.log(a['0']);//3
    console.log(a[0])//3

     

    从上面也可以看到,给数组添加‘0’的属性,也会自动转化成索引。

  3. 数组长度
    length属性总是比最大的一个索引大1(非稀疏数组)。这个length属性有一些特殊的行为。
    往数组添加索引时,自动维护:
    var a = [,,];
    console.log(a.length);//
    a[] = ;
    console.log(a.length);//

    更改length为比现在当前长度的非负整数的时候,大于等于长度的那些元素会被删除:

      var a = [1,2,3,4,5,6,7,8,9];
    console.log(a.length);//
    a.length = 8;
    console.log(a[8]);//undefined
    a.length = 7;
    console.log(a[7]);//undefined

    更改length为比当前长度达的非负整数的时候,相当于增加了空白区域。

  4. 数组遍历
    使用for:
    for(var i = 0; i < array.length; i++){
    
        }

    这样做有个问题就是:要访问很多遍array的length属性,所以更好的做法是下面这种:

    for(var i = 0, len = array.length; i < len; i++){
    
        }

    或者像下面这样从后面开始遍历:

    for(var i = array.length - 1; i >= 0; i--){
    
        }

    另外可以用for/in来遍历:

    for(var i in array){
    
        }

    但是这样子带来的问题就是,除了索引属性之外,还会有继承来的属性、负整数属性、字符串属性也会被包含在其中。

    ecma5定义了一个forEach函数:

      var a = [1,2,3,4,5];
    a.forEach(function(index){
    console.log(index)
    })
  5. 数组方法
    1.   转换方法toString()、toLocalString()、valueOf(),join();
      valueOf得到的还是数组本身。而第二、第三个得到的都是一个数组,实际上是在每个元素上调用了一次toString或toLocaleString函数。

        var a = [1,2,3,4,5];
      console.log(a.toLocaleString());//1,2,3,4,5
      console.log(a.toString());//1,2,3,4,5
      console.log(a.valueOf());//[1,2,3,4,5]

      而且会将数组扁平化:

      var a = [1,2,3,4,5,[ 6,7,[ 8,9] ] ];
      console.log(a.toLocaleString());// 1,2,3,4,5,6,7,8,9
      console.log(a.toString());// 1,2,3,4,5,6,7,8,9

      join方法是利用给定的字符将数组元素连成一个字符串。实际上对每个元素调用了toString方法。

    2. 
      

      var a = [1,2,3,4,5,[6,7,[8,9]]]
      console.log( a.join('*') );//1*2*3*4*5*6,7,8,9
      console.log(a);//var a = [1,2,3,4,5,[6,7,[8,9]]]

      
      
    3. 栈方法push()、pop()
      push会在数组后面添加一个元素,并增加length的值。
          var a = [1,2,3,4,5];
      console.log(a.length);//
      a.push(6);
      console.log(a.length);//
      console.log( a[a.length - 1] );//

      pop刚好相反,它会返回删除的元素。

    4. 队列方法shift()、unshift()
      shift将数组的第一个元素删除并返回,后面的元素往前移,减少length的值。
          var a = [1,2,3,4,5];
      console.log(a.length);//
      a.shift();
      console.log(a.length);//
      console.log( a[0] );//

      unshift刚好相反。

    5. 重排序方法reverse()、sort()
      reverse方法是将数组反序。
          var a = [1,2,3,4,5];
      console.log( a.reverse() );//[5, 4, 3, 2, 1]
      console.log(a);//[5, 4, 3, 2, 1]

      可以看到,reverse是直接改变数组本身的。
      另一个sort方法接受一个函数作为排序的依据。如果不传这个参数,则是对每个元素调用toString方法然后比较。也就是全部转换为字符串然后再比较。

          var a = [2,43,25,64,62,45,75,10,4,7]
      console.log(a.sort());//[10, 2, 25, 4, 43, 45, 62, 64, 7, 75]
      console.log(a);//[10, 2, 25, 4, 43, 45, 62, 64, 7, 75]

      如果传入函数,则函数有两个参数,就是两个要进行比较的数据。如function(a1,a2){};要想a1排在前面就返回小于0;要想顺序不变返回0;另一种情况你懂得。如想要按照数字的小到大排序。

        var a = [2,43,25,64,62,45,75,10,4,7]
      console.log(a.sort(function(a, b){
      return a - b;
      }));//[2, 4, 7, 10, 25, 43, 45, 62, 64, 75]
      console.log(a);//[2, 4, 7, 10, 25, 43, 45, 62, 64, 75]
    6. 操作方法concat()、slice()、splice()
      concat是将一个数组并接在另外一个数组后面。
          var a = [1,2,3,4];
      var b = [5,6,7,[7,8],9];
      console.log(a.concat(b))//[1, 2, 3, 4, 5, 6, 7, [7,8], 9]
      console.log(a)//[1,2,3,4];
      console.log(b)//[5,6,7,[7,8],9]

      可以看到concat并不会将数组扁平化、而且不会改变原数组。它是想创建一个a的副本,然后将b复制进去然后返回。

      slice是基于当前数组,创建一个新的数组。接受两个参数,第二个参数是可选的。如果只有一个参数,就是从指定位置到最后一个的项。如果有两个参数,则是从第一个到第二个指定位置的项,但不包括最后一个。第二个参数可以是负数,-1代表最后一个项,但不包括最后一个。

          var a = [1,2,3,4,5];
      console.log( a.slice(1) );//[2,3,4,5]
      console.log( a.slice(0, 3) );//[1,2,3]
      console.log( a.slice(0, -3) );;//[1,2]

      同样的,slice不会改变原数组。并且当第二个参数的位置在第一个参数位置之前的时候,会返回一个空数组。

      splice功能非常强大,可以删除、插入、替换
      如果只传入两个参数,就是删除,第一个参数代表要删除的其实位置,第二个参数代表要删除的项的个数。

        var a = [1,2,3,4,5];
      console.log(a.splice(1,2));//[2,3]
      console.log(a);//[1,4,5]

      如果传入两个以上参数,并且第二个参数是0,就是插入。第一个参数代表要插入的位置,第三个以及以后的参数代表要插入的项。

          var a = [1,2,3,4,5];
      console.log(a.splice(1,0,7,8));//[]
      console.log(a);//[1,7,8,2,3,4,5]

      如果传入两个以上参数,并且第二个参数不是0,就是替换。第一个参数代表要替换的开始位置,第二个参数代表要替换掉多少个项,第三个以及以后的参数代表要替换进去的项。

          var a = [1,2,3,4,5];
      console.log(a.splice(1,2,7,8));//[2,3]
      console.log(a);//[1,7,8,4,5]

      最后看一个例子:

          var a = [1,2,3,4,5];
      console.log(a.splice(-1,2,7,8));//[5]
      console.log(a);//[1, 2, 3, 4, 7, 8]

      这个例子说明,第一个参数接受负数,-1代表最后一个项。

    7. 位置方法indexOf()、lastIndexOf()
      两个方法的区别是一个从前往后找,一个从后往前找。返回第一个找到的项的位置。
      接受两个参数,第一个是要查找的项,第二个是开始的位置。
          var a = [1,2,3,4,5,4,3,2,1]
      console.log(a.indexOf(4));//
      console.log(a.lastIndexOf(4));//
    8. 迭代方法forEach()、some()、map()、filter()、every()
      这些方法都接受两个参数,第一个是一个将要被调用的函数,第二个参数是可选的,如果有第一个函数会作为该参数的方法调用。传入的函数有三个参数,数组元素、元素索引、数组本身

      forEach是对每个项调用函数,没有返回值。且不能用break提前结束。
      map对每个项调用函数,返回函数返回值组成的数组。
      filter对每个项调用函数,返回使函数返回值为true的项组成的数组。该方法会跳过空元素。
      every对每个项调用函数,如果每个返回值都为true才返回true。
      some对每个项调用函数,如果每个返回值都为false才返回false。

    9. 归并函数reduce(),reduceRight()
      这些方法都接受两个参数,第一个是一个将要被调用的函数,第二个参数是可选的,是传递个函数的初始值。传入的函数有四个参数,上一次归并结果、数组元素、元素索引、数组本身。
      reduce会从第一个项开始调用函数,函数返回值作为第一个参数传给下一次函数调用,以此类推,直到最后,返回一个最后的值作为返回值。
      var a = [];
      for(var i = 1; i <= 100; i++){
      a[i-1] = i;
      }
      var resule = a.reduce(function(last, value, i, arr){
      return last + value
      })
      console.log(resule)//

javascript数组总结的更多相关文章

  1. Javascript数组操作

    使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...

  2. Javascript数组操作(转)

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  3. JavaScript 数组

    JavaScript 数组 简介:数组是值的有序集合,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改. 一:创建数组 ...

  4. 也谈面试必备问题之 JavaScript 数组去重

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  5. js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法

    var  questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf ...

  6. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

  7. 【读书笔记】-- JavaScript数组

    数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素.大多数的语言都会要求一个数组的元素是相同类型,但JavaScript数组可以包含任意类型. var misc = ['string', n ...

  8. 什么才是正确的javascript数组检测方式

    前面的话 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具——typeof ...

  9. javascript数组对象排序

    javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...

  10. javascript数组的知识点讲解

    javascript数组的知识点讲解 阅读目录 数组的基本方法如下 concat() join() pop() push() reverse() shift() sort() splice() toS ...

随机推荐

  1. Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

    MySQL在linux安装之后,连接到服务,报了下面的错误: ERROR 2002 (HY000): Can't connect to local MySQL server through socke ...

  2. CentOS 6.3下部署LVS(NAT模式)+keepalived实现高性能高可用负载均衡

    一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2.6.32-279.el6.i686 LVS版本:ipvsadm-1.26 keepalive ...

  3. Android之ListView分页数据加载

    1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: 点击加载按 ...

  4. POJ 3461 Oulipo[附KMP算法详细流程讲解]

      E - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  5. WEB安全第三篇--控制请求的艺术:CSRF和SSRF

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  6. 【Mac】Docker安装及基础使用

    Docker 安装 在 Mac OS X 系统中,首先你要下载安装包安装:Docker Toolbox 安装过程中,可以选择是否安装 Docker Machine,Docker Compose 等,默 ...

  7. EUI Scroller实现自定义图片轮播 组件ScrollView

    一 自定义组件如下 /** * 文 件 ScrollView.ts * 功 能: 滚动组件 * 内 容: 自定义组件,支持多张图片水平(垂直)切换滚动 * * Example: * 1. 从自定义组件 ...

  8. 【BZOJ3470】Freda’s Walk 概率与期望

    [BZOJ3470]Freda’s Walk Description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一 ...

  9. 【BZOJ4764】弹飞大爷 LCT

    [BZOJ4764]弹飞大爷 Description 自从WC退役以来,大爷是越来越懒惰了.为了帮助他活动筋骨,也是受到了弹飞绵羊一题的启发,机房的小伙伴们决定齐心合力构造一个下面这样的序列.这个序列 ...

  10. [SQL] MSSQL update 语句中的关联

    将tableA 表中的所有title 用tableB中的titlename 更新掉,如果tableB中存在对应的关系 update tableA as a set a.title = (select ...