JavaScript(十二)数组

1. 数组是什么

数组是值的有序集合。数组中的每个值叫做一个元素,而每个元素在数组中都有一个唯一的位置。这个位置用数字表示,叫做索引数据;用字符串表示,叫做关联数组。
JavaScript 数组是无类型的:数组的元素可以是任何类型,例如字符串、数字值、布尔值等,而且每个数组中的不同元素可能是不同类型。
JavaScript 数组是动态的:根据需要,可以动态地向数组插入新的元素,或者从数组中删除指定的元素。

2. 一维数组

2.1 定义数组

数组的最大作用就是用于存储多个值。定义数组分别3种形式:

  • 使用构造函数(对象方式) :
    var myArr1=new Array("yao",8,false);
  • 使用数组关键字方式:
    var myArr2=Array(2,3,"lalal");
  • 使用数组字面量方式:
    var  myArr3=[1,"hah",true];
        // TODO - 以下哪个选项的两个变量类型是相同的
        var num1 = 100;// number
        var num2 = new Number(100);// object

        var str1 = 'string';// string
        var str2 = new String('string');// object

        var boo1 = true;// boolean
        var boo2 = new Boolean(true);// object

        var arr1 = [1,2,3,4,5];// object
        var arr2 = new Array(1,2,3,4,5);// object

值得注意的是: 在一个数组中的不同元素可以是不同数据类型。

数组分类两种:索引数组、

2.2 索引数组

索引数组就是存储元素的位置使用数字值来表示,一般称之为下标或角标。具体创建方式如下述代码:

var arr = [];
arr[0] = 1;
arr[1] = "a";
arr[2] = true;

值得注意的是: 索引数组的下标是从 0 开始的。

2.3 关联数组

关联数组就是存储元素的位置使用字符串来表示,一般称之为名称(name或key)。具体创建方式如下述代码:

var arr = [];
arr['num'] = 1;
arr['str'] = "a";
arr['bool'] = true;

 

值得注意的是: 关联数组的名称(name或key)是字符串,必需使用单引号或双引号将其包裹。

2.4 稀疏数组

    TODO 稀疏数组
    TODO * 数组的索引值可能是跳跃的
    TODO * 可能中间的索引对应的没有任何值 - undefined
    TODO * 存储数据的个数可能小于数组的长度
  
       // 定义数组
       var myArr=new Array(5);// 定义数组的长度为5,而不是存值为5
        myArr[3]="hah";
        console.log(myArr.length);// 5
        console.log(myArr);// (5) [empty × 3, "hah", empty]
        console.log(myArr[1]);//undefined

2.5 数组的长度

每个数组都有一个length属性,表示数组的长度。

  • 如果为非稀疏数组的话,length 属性的值表示当前数组包含元素的个数。
  • 如果为稀疏数组的话,length 属性的值大于当前数组包含元素的个数。
var arr2 = [];
arr2[14] = "a";
console.log( arr2.length );// 输出 15

2.6 数组元素的读取

数组的主要作用是用于存储和读取数据信息,之前已经对数组存储数据信息掌握了。下面来看看如何从数组中读取指定的元素:

     // 定义数组
      var myArr=new Array(1,3,"hah",true,"liuliu");//
        // 取数组的第二个值
        var  value2=myArr[1];
        console.log(value2)//输出: 3

        var myArr2=new Array();
        myArr2['name']="libufan";
        myArr2['age']=18
        console.log(myArr2['name']);//libufan

2.7 数组元素的修改

不仅可以从数组中读取指定的元素,还可以根据需求修改数组中指定的元素值。

     // 定义数组
      var myArr=new Array(5,3,"hah",true,"liuliu");//
        // 取数组的第二个值
        var  value2=myArr[1]=9;
        console.log(value2)//输出:9

        var myArr2=new Array();
        myArr2['name']="libufan";
        myArr2['age']=18;
       var  myName=myArr2['name']='lihaha';
        console.log(myName);//lihaha

2.8 数组元素的删除

不仅可以根据需求修改数组中指定的元素值,也可以删除数组中指定的元素值。数组删除指定元素值使用 delete 关键字。

  // 定义数组
      var myArr=new Array(5,3,"hah",true,"liuliu");//

        // 删除第三个值
        delete myArr[2];
        console.log(myArr);//(5) [5, 9, empty, true, "liuliu"]

值得注意的是: 上述代码使用 delete 关键字执行删除数组元素值的操作时,并不影响数组的长度。

 // 定义数组
      var myArr=new Array(5,3,"hah",true,"liuliu");//
     console.log(myArr.length)// 5
        // 删除第三个值
        delete myArr[2];
        console.log(myArr);//(5) [5, 9, empty, true, "liuliu"]
        console.log(myArr.length)// 5

2.9 遍历数组元素

使用for语句是遍历数组元素最常见的方法:

      // 定义数组
      var myArr=new Array(5,3,"hah",true,"liuliu");//

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

            console.log(myArr[i])// 输出:5,3,"hah",true,"liuliu"

        }

for in 语句

在 ECMAScript 5 中新增了 for in 语句,同样也可以用于遍历数组:

  // 定义数组
      var myArr=new Array(5,3,"hah",true,"liuliu");//

        for (var i in myArr) {
            console.log(i+" :"+myArr[i]);// 分别输出 0 :5;1 :3;2 :hah;3 :true;4 :liuliu
        }

值得注意的是:

  • for 关键字后定义的变量 i 表示当前数组的下标。
  • for in 语句不仅会遍历数组的所有元素,还有一些数组自带的属性。一般建议使用 for 语句进行数组遍历。

for in 语句还可以用于遍历稀疏数组,循环的每次将一个有效元素返回。不存在的索引将不会遍历到:

 // 定义数组
      var myArr=new Array(6);//
        myArr[2]="li";
        myArr[4]="ha";
        for (var i in myArr) {
            console.log(i+" :"+myArr[i]);// 分别输出 2 :li   4 :ha
        }

2.10变量与数组(数组的复制)

 

 <script>
        var str="hah";
        var str2=str;
        str="lala";
        console.log(str);// lala
        console.log(str2);// hah

        var myarr=new Array("li","ha","ha");
        var myarr2=myarr;// 数组是引用类型,myarr是把引用地址赋值给了myarr2对象
        myarr[3]="bang";
        console.log(myarr);//
        console.log(myarr2);//


    </script>

3.1 定义二维数组

  • 定义一个规整的二维数组:
var arr1 = [ [11,12,13], [21,22,23], [31,32,33] ];

 

  • 定义一个不规整的二维数组:
var arr2 = [];
arr2[0] = [ 101 ];
arr2[1] = [ 201, 202 ];
arr2[2] = [ 301, 302, 303 ]; 

3.2 使用二维数组

  • 读取二维数组中的具体元素:
      var arr1 = [ [11,12,13], [21,22,23], [31,32,33] ] ;
        var  a=arr1[1][2];// 第一个中括号里面的数字表示最外面数组的索引,
                          // 第二个中括号里面的的数字表示里面数组的索引
        console.log(a);// 23
        arr1[1][2]=230; // 把23 改成230

 

  • 二维数组的遍历需要使用循环嵌套来实现:
<script>
        var arr1 = [ [11,12,13], [21,22,23], [31,32,33] ] ;

        for ( var i=0;i<arr1.length;i++){
            for ( var b=0;b<arr1[i].length;b++){
                console.log(arr1[i][b]);
            }
        }

    </script>

4. 数组的常见方法

 

4.1 检测数组

如何确定当前是一个数组,JavaScript 提供如下几种方式:

  1. typeof 无法检测数组对象:typeof [] 返回 object
  2. instanceof :[] instanceof Array 返回 true/false
  3. Object.prototype.toString.call( [] ):返回 [ object Array ]
  4. Array.prototype.isPrototypeOf( [] ):返回 true/false
  5. ES5 中新方法: Array.isArray( [] ) : 返回 true/false
        var myarr=new Array("li","ha","ha");

        console.log(typeof myarr);//object
        console.log(myarr instanceof Array);//true
        console.log(Object.prototype.toString.call( myarr ));//[object Array]
        console.log(Array.isArray(myarr));//true
        console.log(Array.isArray(1));//false

4.2 转换方法

JavaScript 提供了如下方法,用于数组的转换:

方法说明
toString()把数组转换为字符串,并返回结果。
valueOf()返回数组对象的原始值。

4.3 进出栈方法

JavaScript 提供了如下方法,用于数组的进出栈操作:

方法说明
push()向数组的末尾添加一个或更多元素,并返回新的长度。
pop()删除数组的最后一个元素并返回删除的元素。
shift()删除并返回数组的第一个元素。
unshift()向数组的开头添加一个或更多元素,并返回新的长度。
        var myarr=new Array("li","ha","ha",916);

        console.log(myarr.push("1993"));//5
        console.log(myarr.pop());//  1993 删除最后一个元素,返回删除的元素
        console.log(myarr);// ["li", "ha", "ha", 916]
        console.log(myarr.shift());// li  删除第一个元素,并返回该元素
        console.log(myarr);// ["ha", "ha", 916]
        console.log(myarr.unshift("plus","huawei"));// 在首位添加元素,并返回长度 5
        console.log(myarr);//(5) ["plus", "huawei", "ha", "ha", 916]

4.4 排序方法

JavaScript 提供了如下方法,用于数组的排序操作:

方法说明
reverse()反转数组的元素顺序。
sort()对数组的元素进行排序。

 

 var myarr=new Array("aa","li","hd","cc","ha");

        console.log(myarr.reverse());// (5) ["ha", "cc", "hd", "li", "aa"]
        console.log(myarr.sort())// (5) ["aa", "cc", "ha", "hd", "li"]

sort() 方法用于对数组的元素进行排序。

排序顺序可以是字母或数字,并按升序或降序。

默认排序顺序为按字母升序。

注意:当数字是按字母顺序排列时"40"将排在"5"前面。

使用数字排序,你必须通过一个函数作为参数来调用。

函数指定数字是按照升序还是降序排列。

 

语法

array.sort(sortfunction)

参数 Values

参数描述
sortfunction可选。规定排序顺序。必须是函数。

返回值

Type描述
Array对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

 

var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
fruits输出结果:

1,5,10,25,40,100

4.5 连接方法

JavaScript 提供了如下方法,用于多个数组之间的连接操作:

方法说明
concat()连接两个或更多的数组,并返回结果。

 

        var myarr=new Array("li","ha","ha");
        var myarr2=new Array(1993,10);
        var myarr3=new Array("yao","yao");

        var arr=myarr.concat(myarr2,myarr3,"string");
        console.log(arr);(8) ["li", "ha", "ha", 1993, 10, "yao", "yao", "string"]

4.6 操作方法

JavaScript 提供了如下方法,用于数组的删除、插入和替换操作:

方法说明
slice()选取数组的的一部分,并返回一个新数组。
splice()从数组中添加或删除元素。
var myarr=new Array("li","ha","ha","yao","qie","nao");
        var newarr=myarr.slice(1,3);// 从下标1开始截取下标3的前一位 ;截左不截右
        console.log(newarr)//(2) ["ha", "ha"]
        var newarr=myarr.slice(1);//从下标1开始截取至最后
        console.log(newarr)//(5) ["ha", "ha", "yao", "qie", "nao"]
var myarr=new Array("li","ha","ha","yao","qie","nao");
        var newarr=myarr.splice(1,2,"bu","fan");
// 第一个参数表示从哪开始删除或添加,第二个表示删除几个元素,第三个及后面的参数表示要添加的元素
        console.log(newarr);//(2) ["ha", "ha"]// 返回删除的元素
        console.log(myarr);//(6) ["li", "bu", "fan", "yao", "qie", "nao"]

4.7 位置方法

JavaScript 提供了如下方法,用于获取数组中指定元素的索引值:

方法说明
indexOf()搜索数组中的元素,并返回它所在的位置。
lastIndexOf()返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
    var myarr=new Array("li","ha","ha","yao","ha","qie","nao");

        console.log(myarr.indexOf("ha"));// 1
        console.log(myarr.lastIndexOf("ha"));//4

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值