美文网首页
JavaScript数组

JavaScript数组

作者: 54黄药师 | 来源:发表于2018-04-11 22:43 被阅读0次

    一、JavaScript中数组的定义

    • 数组的标准定义:一个存储元素的线性集合(collection),元素可以通过索引来引用任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
    • JavaScript数组的定义:是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。然而,这些数字索引在内部是被转换成字符串类型的,这是因为JavaScript对象中的属性必须是字符串类型,内部的元素可以使任意类型的。

    二、数组的操作

    1. 创建数组

    • 方式一:
    var numbers = [];
    
    • 方式二:
    // 当传入一个数字类型的参数时,表示数组的长度,其他则表示数组的元素。
    var numbers = new Array();
    

    这两种方式推荐使用方式一,因为这种方式效率更高。

    2. 读写数组

    一般使用 [] 操作符

    3. 由字符串生成数组

    split() 方法:

    • 作用:通过分隔符,将字符串分成几部分,并将每部分作为一个元素保存在一个新的数组中。
    • 参数:分隔符
    • 返回值:新的数组
    • 元字符串不发生改变。
    var str = 'hello world javascript css html';
    var words = str.split(' '); // words为一个数组
    

    4. 对数组的整体操作

    4.1 将一个数组赋值给另一个数组

    改操作只是给被赋值的数组增加了一个新的引用,其实两个变量指向的是一个数组,两者的操作是相互影响的。通常被称为“浅复制”。
    如何实现深复制:

    // 将arr1深复制给arr2
    function copy (arr1,arr2) {
      for (var i = 0; i < arr1.length; i++) {
        arr2[i] = arr1[i]
      }
    }
    

    拓展:如何实现一个对象的深复制?

    function copyObj (obj1, obj2) {
      var obj2 = obj2 || {};
      for (item in obj1) {
        if (typeof item === 'object') {
          obj2[item] = (obj1[item].constructor === Array):[]?{}; // 判断属性是否为对象或是数组
          copyObj(obj1[item], obj2[item]);
        }else{
          obj2[item] = obj1[item]
        }
      }
      return obj2;
    }
    

    5. 存取操作

    5.1 查找匹配元素
    5.1.1 indexOf():
    • 作用:用来查找传进来的参数在目标函数中是否存在;
    • 参数:要查找的内容
    • 返回值:如果有,则返回改元素在目标数组中的索引,如果不存在则返回-1
    • 原数组不发生改变
    var names = ['huangjin','qq','jack','hellen'];
    var postion = names.indexOf('qq')
    console.log(postion); // 1
    
    5.1.2 slice():
    • 作用:数组的查询
    • 参数:slice(n,m):从索引n开始,查询到索引为m前,不包含m
    • 返回值:把找到的以新的数组返回
    • 原来数组不发生改变
    • 特殊情况:
      • 如果只写一个参数是,则从指定索引找到末尾
      • slice(0)和slice(),表示数组克隆
      • 支持负数索引,如果传递了负数,浏览器解析时是按总长度+负数索引 来处理的
    5.2 数组的字符串表示
    5.2.1 toString():
    • 作用:将数组转换成字符串,各元素用逗号隔开
    • 参数:无
    • 返回值:各元素以逗号分隔的字符串
    • 原数组不发生改变
    var names = ['huangjin','qq','jack','hellen'];
    console.log(names.toString()); 
    
    5.2.2 join():
    • 作用:将数组转换成字符串,各元素用指定的分隔符分隔
    • 参数:分隔符
    • 返回值:各元素以指定分隔符链接的字符串
    • 原数组不发生改变
    console.log(names.join('-')); // huangjin-qq-jack-hellen
    
    5.3. 由已有数组创建新的数组
    5.3.1 concat():
    • 作用:合并多个数组,方法的调用者为一个数组,作为参数的数组会被链接到调用数组的而后面;
    • 参数:一个或者多个,可以使数组,或其他类型
    • 返回值:合并后的新数组
    • 原数组不发生改变。
    console.log(names.concat(['aaa','bbb']));
    VM629:1 (6) ["huangjin", "qq", "jack", "hellen", "aaa", "bbb"]
    
    console.log(names.concat(['aaa','bbb'],'ccc'));
    VM631:1 (7) ["huangjin", "qq", "jack", "hellen", "aaa", "bbb", "ccc"]
    
    console.log(names.concat(['aaa','bbb'],'ccc',123));
    VM633:1 (8) ["huangjin", "qq", "jack", "hellen", "aaa", "bbb", "ccc", 123]
    
    
    5.3.2 splice(n,m):
    • 作用:截取一个数组的子集作为一个新的数组
    • 参数:第一个是截取的开始索引,第二个为结束索引,如果第二个不传,则一直截取到末尾,如果两个参数都不传,则不截取;
    • 返回值:截取出来的元素组成的新数组
    • 原数组改变
    names = ['a','b','c','d','e'];
    
    console.log(names.splice(1,2));
    VM837:1 (2) ["b", "c"]
    
    console.log(names);
    VM839:1 (3) ["a", "d", "e"]
    
    console.log(names.splice(1));
    VM841:1 (2) ["d", "e"]
    
    console.log(names);
    VM843:1 ["a"]
    
    console.log(names.splice());
    VM845:1 []
    
    console.log(names);
    VM847:1 ["a"]
    

    拓展:splice可以用于增加和删除数组元素,删除操作跟上面一样,只是这是删除是相对于原数组,而上面的是相对于返回值。所以删除就不做介绍,这里主要讲解一下新增元素。如下:

    • splice(n,m,x):在原有删除的基础上,用x替换删除的内容
      • 返回值:被替换的原有值
      • 原数组发生改变
    • 增加操作:
      • splice(n,0,x):在修改的基础上,一项都不删除,把x插入到索引n的前面
    names = ['a','b','c']
    
    console.log(names.splice(1,0,'d'));
    VM928:1 []
    
    console.log(names);
    VM953:1 (4) ["a", "d", "b", "c"]
    

    6. 可变函数

    JavaScript的数组的可变函数主要是用来在不引用数组中某个元素的情况下,改变数组内容。

    6.1 从数组的首尾添加元素
    6.1.1 push():
    • 作用:将一个元素添加到数组末尾
    • 参数:要添加的元素内容,可以是多个
    • 返回值:添加新元素后数组的长度
    • 原数组改变
    var names = ['a','b','c']
    
    names.push('d')
    4
    console.log(names)
    VM297:1 (4) ["a", "b", "c", "d"]
    
    6.1.2 unshift():
    • 作用:将一个元素添加到数组的前面
    • 参数:要添加的元素内容,可以是多个
    • 返回值:添加新元素后的数组长度
    • 原数组改变
    console.log(names)
    VM297:1 (4) ["a", "b", "c", "d"]
    
    console.log(names.unshift(1));
    VM351:1 5
    
    console.log(names)
    VM353:1 (5) [1, "a", "b", "c", "d"]
    
    6.2 从数组的首尾删除元素
    6.2.1 pop():
    • 作用:删除数组末尾的元素
    • 参数:无
    • 返回值:删除末尾元素后数组的长度
    • 原数组改变
    6.2.2 shift():
    • 作用:删除数组的第一个元素,数组后面的袁术向前移动一位
    • 参数:无
    • 返回值:删除元素后数组的长度
    • 原数组改变
    6.3 从数组的中间位置添加和删除元素

    splice():

    • splice(n,m):从第n到m删除
      • 返回值:被删除的元素
      • 原数组发生改变
    • 增加操作:
      • splice(n,0,x):在修改的基础上,一项都不删除,把x插入到索引n的前面
    6.4 数组排序
    6.4.1 reverse():
    • 作用:颠倒数组
    • 参数: 无
    • 返回值:颠倒后的数组
    • 原数组改变
    6.4.2 sort():
    • 作用:按规则排列数组
    • 参数:无或者回调函数,当无参数时,按照Unicode排序
    • 返回值:排序后的数组
    • 原数组改变
    function compare(a,b) {
      return a-b; // 如果为正,按升序,为0位置不变,为负则按降序
    }
    var nums = [1,2,5,3,55,43,4];
    nums.sort(compare);
    

    7. 迭代器方法

    7.1 不生成新数组的迭代器方法

    即,不产生任何新的数组,要么对于数组中的每个元素执行某种操作,要么返回一个值。

    7.1.1 forEach():
    • 作用:对数组中的每个元素进行规定的操作
    • 参数:函数,即对每个元素执行的操作函数
    • 返回值:无
    • 原数组不改变
    console.log(names)
    VM586:1 (5) [1, "a", "b", "c", "d"]
    
    console.log(names.forEach(function(a){console.log('f'+a)}));
    VM624:1 f1
    VM624:1 fa
    VM624:1 fb
    VM624:1 fc
    VM624:1 fd
    VM624:1 undefined
    
    console.log(names)
    VM626:1 (5) [1, "a", "b", "c", "d"]
    
    7.1.2 every():
    • 作用:匹配所有元素都复合某个规则
    • 参数:返回值为布尔类型的函数
    • 返回值:如果数组中的每个元素经过该函数返回为true,则返回为true,否则为false
    • 原数组不发生改变
    var nums = [1,2,3,4,5]
    
    nums.every(function(i){if(i>0){return true}});
    true
    nums.every(function(i){if(i>1){return true}});
    false
    
    7.1.3 some():
    • 作用:匹配数组中是否有元素都复合某个规则
    • 参数:返回值为布尔类型的函数
    • 返回值:如果数组中的只要有一个元素经过该函数返回为true,则返回为true,否则为false
    • 原数组不发生改变
    7.1.4 reduce():
    • 作用:接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
    • 参数:用于执行每个数组元素的函数
    • 返回值:返回计算结果
    • 原数组不改变
    var numbers = [65, 44, 12, 4];
     
    function getSum(total, num) {
        return total + num;
    }
    function myFunction(item) {
        console.log(numbers.reduce(getSum));
    }
    
    7.2 生成新数组的迭代器方法
    7.2.1 map():
    • 作用:类似于forEach(),区别在于map()会返回一个新数组
    • 参数:用于执行每个数组元素的函数
    • 返回值:返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
    • 原数组不改变
    var numbers = [4, 9, 16, 25];
    
    function myFunction() {
        console.log(numbers.map(Math.sqrt));
    }
    
    7.2.2 filter():
    • 作用:和every() 类似,区别在于every()返回的是布尔值,而filter() 返回的是新数组,该数组包含应用回调函数后值为true的元素
    • 参数:用于执行每个数组元素的函数
    • 返回值:返回一个包含应用回调函数后值为true的元素的数组
    • 原数组不改变

    三、总结

    • JavaScript中的数组其实是一个特殊的对象
    • 创建数组的方式主要有两种,但常用的是 [] 的形式
    • 数组转字符串:toString()、 join()
    • 字符串转数组:split()
    • 数组的增删改查:
      • 增加:push()、 unshift()、 splice(n,0,x)、 concat()
      • 删除:pop()、shift()、splice(n,m)
      • 更改:splice(n,m,x)
      • 查询:indexOf()、slice(n,m)
    • 数组排序: reverse()、sort()
    • 数组遍历: forEach()、map()、every()、some()、filter()等

    相关文章

      网友评论

          本文标题:JavaScript数组

          本文链接:https://www.haomeiwen.com/subject/bgltkftx.html