zoukankan      html  css  js  c++  java
  • JS数组

    一、什么是数组

    内存中连续多个数据的数据结构,再起一个统一的名字。

    数组也是一个对象,和我们普通的对象功能类似,也是用来储存一些值的。不同的是普通对象是使用字符串作为属性名的,而数组使用数字作为索引操作元素。

    数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据。

    使用 typeof 检查数组的数据类型时就会返回 object 对象类型。

    为什么要使用数组:

    普通的变量只能存储一个数据程序(数据程序 = 数据结构 + 算法

    算法:解决问题的步骤

    数据结构:数据在内存中的存储结构,好的数据结构可以极大的提高程序的执行效率

    什么时候使用数组:

    只要存储多个连续的数据就使用数组

    二、创建数组

    (一)创建空数组:2种

    1、数组字面量:

    语法: var arr = [ ];

    var arr = [ ];    //意味着创建一个不包含元素的数组

    var arr = [12,13,14];  //意味着创建一个包含三个元素的数组

    2、使用构造函数:

    语法:var arr = new Array();

    var arr = new Array();  //定义一个不包含元素的数组

    var arr = new Array('Aa','Bb','Cc');  //定义一个三个字符串元素的数组

    在创建数组时,还不知道数组里面的元素内容时。

    (二)创建数组的同时初始化

    1、数组字面量:var arr = [元素1,元素2…];

    2、用 new Array方法:var arr = new Array(元素1,元素2,…)

    在创建数组时,如果已经知道了数组里面的元素内容,就可以使用创建数组并同时进行初始化这种方式。

    var array = [111,222,333];

    var array = new Array(111,222,333);

    (三)先声明空数组,再添加元素

    直接量

    var arr = [ ];
    arr[0] = 'aaa';
    arr[1] = 'bbb';

    new Array方法

    var arr = new Array();
    arr[0]  = '安安';
    arr[1] = 111;
    arr[3] = true;

    上面这种既有字符串又有数字,还有布尔值的数组,称之为混合类型的数组

    三、访问数组中的元素

     元素:数组中的每个数据都是元素

    如何访问:下标,数组中唯一标识每个元素储存位置的序号。

    索引:从0开始的整数就是索引;索引(index)一个索引对应一个值,这一个整体称之为元素。

    特点:从0 开始,连续不重复

    何时:如果想访问数组元素只能,使用下标

    语法:数组名[ i ] (用法和单个变量完全一样)

    数组GET操作和SET操作

    (一)设置数组元素的值——SET

    1、向数组中添加元素

    语法:数组[索引] = 值;

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    console.log(arr);

    注意:10在索引为0的位置,33在索引为1的位置,索引都是从0开始的

     2、向数组中修改添加元素

     var ss = [98,22,100];
     ss[2] = 60;  //将值为100的元素重新赋值为60;
    ss[3] = 75;  //在元素的尾部添加一个新的元素;

    注意:索引从0 开始,最大到 length-1;

    (二)获取数组元素的值——GET

    语法: 数组[索引]

    1、读取数组中的元素

    注意:如果读取不存在的索引,他不会报错而是返回 undefined

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    console.log(arr[2]);
    console.log(arr[4]);

    (三)数组的 length 属性:

    (获取数组的元素个数)

    记录了数组中理论上的元素的个数,length 的值永远都是最大下标 +1

    语法数组.length

     length 设置或是获取数组的长度 (检查有几个元素,元素个数)

    1、对连续的数组使用length,可以获得数组中元素的个数(连续的数组——缩印按照顺序排列0、1、2、3、…)

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    console.log(arr.length);

    2、对非连续的数组,length的数组长度为最大索引+1(假设最大索引是98,那么数组.length的结果就是99)

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    arr[10]= 99;
    console.log(arr.length);
    console.log(arr);

    (修改length)

    1、如果修改的 length 大于数组原来长度,则多出的部分会空出来

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    arr.length = 10;
    console.log(arr.length);
    console.log(arr);

    2、如果修改的 length 小于原长度,则多出的元素会被删除(可以通过length来删除元素)

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    arr.length = 2;
    console.log(arr.length);
    console.log(arr);

    (向数组最后一个位置添加元素)

    语法: 数组[数组.length] = 值;

    注意: 如果 [ ] 里不加数组名,那么就是到全局中去找length(假设数组的最大索引为3,就要往4加。如果想往数组再添加顺序索引内容,就要比最大索引 + 1)。

    var  arr = new  Array();
    arr[0] = 10;
    arr[1] = 33;
    arr[2] = 22;
    arr[3] = 44;
    arr[arr.length] = 77;
    arr[arr.length] = 88;
    arr[arr.length] = 99;
    console.log(arr.length);
    console.log(arr);

    四、数组遍历

    遍历数组的元素,通常选用 for 循环语句,元素的检索(下标)作为循环变量

    元素索引从0开始,到 length-1 结束

    var arr = [12,13,14,15,16]
    for(var i = 0;i<arr.length;i++){
        arr[i] += 10;
    }
    console.log(arr);

     length总结:

    获得数组的最后一个元素arr[arr.length - 1]

    获得倒数第n个元素的位置arr[arr.length - n]

    数组缩容:减小  arr.length 的数值,会删除结尾的多余元素

    遍历数组:依次访问数组中的每个元素,对每个元素执行相同的操作

    for(var i = 0;i<arr.length;i++){
        arr[i]  //当前正在遍历的元素
    }

    五、数组类型

    (一)索引数组:下标为数字的数组

    数组特殊的特点:三个不限制

    1、不限制数组元素的个数:长度可变

    2、不限制下标越界

    获取元素:不报错!返回undefined

    修改元素值:不报错!自动在指定位置创建新元素,并自动修改length属性值为最大索引 +1;

    修改length属性为最大索引 +1;

    如果索引不连续的数组——稀疏数组

    3、不限制元素的数据类型

    (二)关联数组:可以自定义下标名称的数组

    为什么使用关联数组

    索引数组中的下标没有明确的意义;

    hash数组可以实现元素的快速增删,查找,

    什么时候使用关联数组

    只有希望每个元素都有专门的名称的时候,就使用关联数组;

    1、关联数组的创建方式

    如何创建关联数组(两步)

    第一步:创建空数组

    第二步:向空数组中添加新元素,并且自定义下标名称。

    var name = [ ];
    name['xiaoming'] = '小明';
    name['hanhan'] = '憨憨';

    2、关联数组的遍历

    由于关联数组的 length 属性值无法获取其中元素的数量,所以遍历关联数组只能使用for … in循环

    for( var key in hash){
           key //只是元素的下标名
           aa[key] //当前元素值
    }

     (三)索引数组和关联数组的对比

    索引数组:

    1、以字符串输出

    2、索引是数字

    3、length属性有效

    4、访问元素,都用数组名['索引']

    5、可以 for 循环遍历

    关联数组:

    1、不能使用字符串输出

    2、下标是自定义的字符串

    3、length属性失效(=0)

    4、不能用 for 循环遍历,需要使用 for … in循环

     索引数组和关联数组的查找

     总结:如果只要希望快速查找元素的时候,就使用hash数组

    六、数组的空位

    当数组的某个位置为空元素(即两个逗号之间没有任何值),则称这个数组存在空位(hole)

    数组的空位不会影响length的值;

    var arr = [1,2,3,,4];
    console.log(arr.length);

    注意:如果最后一个元素后面有逗号,并不会产生空位,即有没有这个逗号,结果都是一样的。

    下面例子中,数组的最后一个成员后面有一个逗号,这并不影响length属性的值,与没有逗号的时候是一样滴。

    var arr = [1,2,3,];
    console.log(arr.length);

    数组的空位是可以读取的,结果返回undefined

    使用 delete 命令删除一个数组成员,会形成空位,并且不会影响 length 属性。

    使用delete 命令删除了数组第二个元素,这个位置就形成了空位,但是产生空位之后对length属性是没有影响的。

    也就是说,length属性是不过滤空位的。所以如果想使用length属性进行数组遍历,要小心可能会出现空位现象。

    数组的某个位置的空位,与某个位置是undefined,是两种不同的情况。如果是空位,使用数组的forEach方法、for…in结构、Object.keys方法进行遍历,空位都会被跳过。

    var a = [, , ,];
    a.forEach(function (x, i) {
     console.log(i + '. ' + x);
    })

    没有任何输出


    for (var i in a) {
     console.log(i);
    }
    // 不产生任何输出
    Object.keys(a)
    // []

     

     当某个位置是undefined的时候,遍历的时候就不会被跳过;

    var a = [undefined, undefined, undefined];
    a.forEach(function (x, i) {
     console.log(i + '. ' + x);
    });
    // 0. undefined
    // 1. undefined
    // 2. undefined
    for (var i in a) {
     console.log(i);
    }
    // 0
    // 1
    // 2
    Object.keys(a)
    // ['0', '1', '2']

     空位就相当于数组中没有这个元素,所以不会被遍历到;

    undefined则表示数组中有这个元素,只是值是undefined,所以遍历不会跳过;


    实例一:

    求取数组的和平均值

    实现步骤:

    先声明 一个求和变量 sum;

    遍历这个数组。把里面每个数组元素加到 sum里面;

    用求和变量 sum 除以数组的长度就可以得到数组的平均值;(想要输出多个变量,使用逗号分隔即可)

    var arr=[2,6,1,7,4];
    var sum = 0;
    var average = 0;
    for(var i =0;i< arr.length;i++){
        sum += arr[i];
    }
    average = sum / arr.length;
    console.log(sum,average);

     实例二:

    求取数组中的最大值

    实现步骤:

    声明一个保存最大元素的变量 max;

    默认最大值也可以取数组中的第一个元素。

    遍历这个数组,并把里面的每个数组元素和 max相比较。

    如果这个数组元素大于 max的值,那么就将这个数组元素存到 max里面,否则继续进行下一轮比较;

    最后输出最大值 max;

    (如何去理解呢,可以理解为擂台赛,一个人在擂台守擂(守擂的人就相当是最大值),其他人与他较量,如果赢了,就代替原来的人守擂,就是最厉害的(最大值))

    var arr=[2,5,9,34,1,89,50];
    var max=arr[0];
    for(var i=1;i<arr.length;i++){
        if(arr[i] > max){
            max=arr[i];
        }
    }console.log(max);

     还可以用三元运算符代替 if 语句:

    补充:三元运算符

    语法:表达式1?表达式2:表达式3

    表达式1是条件,值为 Boolean类型;

    若表达式 1的值为 true,则执行表达式 2 的操作,并且以表达式 2的结果为整个表达式的结果;

    若表达式 1的值为 false,则执行表达式 3 的操作,并且以表达式 3的结果为整个表达式的结果;

    下面的三元运算语句含义为:

    如果 arr[i]<max (数组中的元素小于max)为 真true,则变量max的值还是原来的不变;

    如果 arr[i]<max (数组中的元素小于max)为 假false,则变量max的值变成 arr[i]的结果;

    var arr=[2,5,9,34,1,89,50];
    var max=arr[0];
    for(var i=1;i<arr.length;i++){
        max = arr[i] < max?max:arr[i];
    }console.log(max);

    实例三:

    求取数组中的最小值,和求取数组中的最大值思路一致。只需要换个符号就可以了。

    var arr=[2,5,9,34,1,89,50];
    var min=arr[0];
    for(var i=1;i<arr.length;i++){
        if(arr[i]<min){
            min=arr[i];
        }
    }console.log(min);

     或者是使用三元运算符,返回结果也是一样的。

    var arr=[2,5,9,34,1,89,50];
    var min=arr[0];
    for(var i=1;i<arr.length;i++){
        min = arr[i] < min?arr[i]:min;
    }console.log(min);

    实例四:

    数组转换成字符串,并使用符号分隔

    实现步骤:

    需要一个新的变量用于存放转换完之后的字符串 str

    遍历原来的数组,分别把里面的数据取出来,加到字符串里。

    同时在后面多加一个分隔符号;

    var arr=["yi","er","san","si","wu"];
    var str='';
    var sep='/';
    for(var i=0;i< arr.length;i++){
        str += arr[i]+sep;
    }
    console.log(str,typeof(str));

  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/nyw1983/p/11788891.html
Copyright © 2011-2022 走看看