[关闭]
@Wangww0925 2019-08-07T07:53:36.000000Z 字数 9235 阅读 235

ECMAScript的核心语言 (二)数组 Array

js-笔记


数组值的有序集合

每个值叫做数组的元素

数组的元素可以是任何类型

  1. var arr = [100,'abc',true,null,undefined,{username:'小毛'},[1,2,3]];

每个元素在数组中都有一个位置,用数字表示

  1. 称为数组的下标(索引)
  2. 数组的索引是从 0 开始的,索引的最大值为2^32-2 4294967294个元素

数组的长度:length属性

注意:只计算非负整数

  1. var array=[]; // 给数组添加元素
  2. array[0] = ['a'];
  3. array[-1] = ['1'];
  4. array['name'] = ['www'];
  5. console.log(array); // 返回 [Array[1], -1: Array[1], name: Array[1]]
  6. console.log(array.length); // 返回 1

数组的声明方式:

1、使用直接量,直接赋值

  1. var arr = [1,2,3,4];
  2. console.log(arr); // 返回[1,2,3,4]
  3. var arr1 = []; // 声明一个空数组
  4. console.log(arr1); // 返回[]

2、使用构造函数 new Array()

  1. 1. var array = new Array();
  2. console.log(array); // 返回[]
  3. 2. var array1 = new Array('a','b','c');
  4. console.log(array1); // 返回['a','b','c']
  5. 3. var array2 = new Array(10,20,30);
  6. console.log(array2); // 返回[10,20,30]
  7. 4. var array3 = new Array(3); 此时3是数组的长度
  8. console.log(array3); // 返回[],是稀疏数组
  9. document.write(array3); // 返回[,,]

数组元素的访问、修改、添加: 使用[],配合下标

1、 数组元素的访问

  1. var newArr = ['a','b','c','d'];
  2. console.log(newArr[3]); // 返回 d
  3. // 特殊情况,使用数字类型的字符串访问数组
  4. console.log(newArr[3]); // 返回 d
  5. console.log(newArr['3']); // 返回 d,字符串访问数组会自动转换

2、 数组元素的修改

  1. var newArr = ['a','b','c','d'];
  2. newArr[0] = 'www'; // 将a修改成www
  3. console.log(newArr); // 返回["www", "b", "c", "d"]

3、 数组元素的添加

  1. var arr = [];
  2. arr[0] = 'a';
  3. arr[1] = 'b';
  4. console.log(arr); // 返回['a','b']

稀疏数组: 不连续索引的数组

稀疏数组出现的原因:

1、创建的时候出现

  1. var arr1=new Array(4);
  2. console.log(arr1); // 返回 ,,,,
  3. var arr2 = [,,'a',,,];
  4. console.log(arr2); // 返回 ,,a,,

2、添加元素的时候索引太大

  1. var arr3 = [];
  2. arr3[0] = 'a';
  3. arr3[1] = 'b';
  4. arr3[5] = 'c';
  5. console.log(arr3); // 返回 a,b,,,,c

3、使用delete删除数组元素造成稀疏数组

  1. var arr4 = [1,2,3,4,5];
  2. delete arr4[2];
  3. delete arr4[3];
  4. console.log(arr4); // 返回 1,2,,,5
  5. console.log(arr4[2]); // 返回 undefined,删除掉的元素变成undefined

将稀疏数组变成不稀疏

思路:定义一个新的数组,使用push()将旧数组中不是undefined的元素添加到新数组中

  1. var arr = ['a','b',,,'c'];
  2. var newArr = [];
  3. for(var i = 0; i < arr.length; i++){
  4. if(arr[i] != undefined){
  5. // newArr[i] = arr[i]; // 不能直接赋值
  6. newArr.push(arr[i]); // push在数组的后面添加元素
  7. }
  8. }
  9. console.log(newArr); // 返回 ['a','b','c']
  10. /*
  11. * push过程:
  12. * []
  13. * ['a']
  14. * ['a','b']
  15. * ['a','b','c']
  16. */

通过splice() 将稀疏数组变成不稀疏:

写在 数组的方法 -> splice()


判断是否是数组: Array.isArray()

注意: typeof [1,2,3] // 返回 object,不能用于判断

1、ES5提供的新方法 Array.isArray(): true | false

  1. console.log(Array.isArray([])) // 返回true
  2. console.log(Array.isArray(1000)); // 返回false

2、自定义一个函数,判断一个值是否在数组中

  1. var array = ['a','b','c'];
  2. function getBool(index,arr){
  3. // 当index值和arr不存在、arr不是数组、arr数组长度小于1时,结束函数
  4. if(index == undefined || arr == undefined || !Array.isArray(arr) || arr.length < 1){
  5. alert('请传入正确的参数');
  6. return;
  7. }
  8. // 当数组中的值等于index值时,返回true并结束函数
  9. for(var i = 0; i<arr.length; i++){
  10. if(arr[i] === index){
  11. return true;
  12. }
  13. }
  14. return false;
  15. }
  16. console.log(getBool('a',array)); // 返回 true; a在数组中
  17. console.log(getBool('d',array)); // 返回 false; d不在数组中

判断数组是否具有某个值: arr.indexOf()

如果存在返回下标(索引),如果不存在返回-1

  1. var arr = ['a','b','c',1,2,3];
  2. console.log(arr.indexOf('a')); // 返回 0
  3. console.log(arr.indexOf(2)); // 返回 4
  4. console.log(arr.indexOf('d')); // 返回 -1

数组元素的添加总结:

1、直接指定索引:

  1. var arr = ['a','b','c'];
  2. arr[3] = 'd';
  3. console.log(arr); // 返回 ['a','b','c','d']

2、使用数组长度进行添加:

  1. var arr = ['a','b','c'];
  2. arr[arr.length] = 'd';
  3. console.log(arr); // 返回 ['a','b','c','d']

3、push()方法: 在数组后面添加元素

注意: push() 有返回值的,返回新数组长度

  1. var arr = ['a','b','c'];
  2. var leng = arr.push('w','ww');
  3. console.log(arr); // 返回 ["a", "b", "c", "w", "ww"]
  4. console.log(leng); // 返回 5,新数组长度

4、unshift()方法: 在数组的前面加入元素

注意: unshift() 有返回值,返回新数组长度

  1. var arr = ['a','b','c'];
  2. var len = arr.unshift('www');
  3. console.log(arr); // 返回 ['www','a','b','c']
  4. console.log(len); // 返回 4

5、 splice() 数组的方法中说明


数组元素的删除总结:

1、pop()方法: 删除后面的一个元素

注意: 有返回值,返回被删除的元素

  1. var arr = ['a','b','c'];
  2. var len = arr.pop();
  3. console.log(arr); // 返回 ['a','b']
  4. console.log(len); // 返回 c

2、shift()方法: 删除前面的一个元素

注意: 有返回值,返回被删除的元素

  1. var arr = ['a','b','c'];
  2. var lent = arr.shift();
  3. console.log(arr); // 返回 ['b','c']
  4. console.log(lent); // 返回 a

3、splice() 数组的方法中说明


数组的遍历总结

1、for 循环: 不能遍历出特殊下标的元素

  1. var arr = ['大毛','二毛','三毛','四毛'];
  2. arr[-1] = 'abc';
  3. arr['name'] = '曹操';
  4. console.log(arr); // 返回 ["大毛", "二毛", "三毛", "四毛", -1: "abc", name: "曹操"]
  5. console.log(arr[-1]); // 返回 abc
  6. for(var i = 0; i < arr.length;i++){
  7. console.log(arr[i]); // 返回 大毛 二毛 三毛 四毛
  8. }

2、for in 遍历: 可以遍历出特使下标的元素;并忽略掉没有内容的索引

  1. var arr = ['大毛','二毛','三毛','四毛'];
  2. arr[-1] = 'abc';
  3. arr['name'] = '曹操';
  4. console.log(arr); // 返回 ["大毛", "二毛", "三毛", "四毛", -1: "abc", name: "曹操"]
  5. console.log(arr[-1]); // 返回 abc
  6. for(var i in arr){
  7. console.log(i); // 返回 0 1 2 3 -1 name;i是数组中所有的下标,包括特殊下标
  8. console.log(arr[i]); // 返回 大毛 二毛 三毛 四毛 abc 曹操
  9. }

3、ECMA5的新方法 forEach(function(x){}) : IE不支持,不能遍历出特殊下标的元素

  1. var arr = ['大毛','二毛','三毛','四毛'];
  2. arr[-1] = 'abc';
  3. arr['name'] = '曹操';
  4. console.log(arr); // 返回 ["大毛", "二毛", "三毛", "四毛", -1: "abc", name: "曹操"]
  5. console.log(arr[-1]); // 返回 abc
  6. arr.forEach(function(x){
  7. console.log(x); // 返回 大毛 二毛 三毛 四毛; x是数组的每一个元素
  8. })

4、关于稀疏数组的遍历: 推荐使用 for in

  1. var arr = ['大毛','二毛','三毛','四毛'];
  2. arr[-1] = 'abc';
  3. arr['name'] = '曹操';
  4. console.log(arr); // 返回 ["大毛", "二毛", "三毛", "四毛", -1: "abc", name: "曹操"]
  5. console.log(arr[-1]); // 返回 abc
  6. var array = [1,2,3,,,,,5,6,7];
  7. for(var i = 0; i < array.length; i++){
  8. console.log(array[i]); // 返回 1 2 3 undefined undefined undefined undefined 5 6 7
  9. }
  10. for(var i in array){
  11. console.log(array[i]); // 返回 1 2 3 5 6 7;忽略掉没有内容的索引
  12. }

数组的方法:

1、join() 将数组以指定的字符连接成字符串

默认使用,连接

  1. var arr = ['a','b','c'];
  2. console.log(arr.join()); // 返回 a,b,c
  3. console.log(arr.join('--')); // 返回 a--b--c
  4. console.log(arr.join('')); // 返回 abc

2、toString() 将数组转换成字符串

  1. var arr = [23,21,3,4,12,15];
  2. console.log(arr.toString()); // 返回 23,21,15,12,4,3
  3. console.log(arr); // 返回 [23, 21, 3, 4, 12, 15]

3、toLocaleString() 把数组转换为本地字符串(不常用)

4、concat() 合并数组

  1. var arr1 = ['a','b'];
  2. var arr2 = ['1','2'];
  3. console.log(arr1.concat(arr2)); // 返回 ["a", "b", "1", "2"]
  4. console.log(arr2.concat(arr1)); // 返回 ["1", "2", "a", "b"]
  5. console.log(arr2.concat(arr1,[3,4],[5,6])); // 返回 ["1", "2", "a", "b", 3, 4, 5, 6]
  6. console.log(arr1.concat(1,2,3)); // 返回 ["a", "b", 1, 2, 3]
  7. console.log(arr1.concat(1,2,[4,5,6])); // 返回 ["a", "b", 1, 2, 4, 5, 6]

5、reverse() 数组翻转:

  1. var arr = ['a','b','c','123'];
  2. arr.reverse();
  3. console.log(arr); // 返回 ["123", "c", "b", "a"]

6、sort() 数组排序

需要传入匿名函数

默认按照ASCII码,按位比较

  1. var arr1 = [23,21,3,4,12,15];
  2. console.log(arr1.sort()); // 返回 [12, 15, 21, 23, 3, 4]
  3. var arr2 = ['ab','c','ad','d'];
  4. console.log(arr2.sort()); // 返回 ["ab", "ad", "c", "d"]

升序

  1. arr.sort(function(a,b){
  2. return a-b;
  3. })

例:

  1. var arr1 = [23,21,3,4,12,15];
  2. arr1.sort(function(a,b){
  3. return a-b;
  4. })
  5. console.log(arr1); 返回[3, 4, 12, 15, 21, 23]

降序

  1. arr.sort(function(a,b){
  2. return b-a;
  3. })

例:

  1. var arr1 = [23,21,3,4,12,15];
  2. arr1.sort(function(a,b){
  3. return b-a;
  4. })
  5. console.log(arr1); 返回[23, 21, 15, 12, 4, 3]

7、slice() 截取数组; -- 不破坏原来的数组;返回截取部分的元素

slice(2,5); 下标2截取到下标5,不包括下标5

  1. var arr = ['a','b','c','123','aa','bb'];
  2. console.log(arr.slice(2,5)); // 返回 ["c", "123", "aa"];截取部分的元素
  3. console.log(arr); // 返回 ["a", "b", "c", "123", "aa", "bb"];不破坏原来的数组

slice(2); 从下标2开始截取后面全部内容

  1. var arr = ['a','b','c','123','aa','bb'];
  2. console.log(arr.slice(2)); 返回["c", "123", "aa", "bb"]
  3. console.log(arr); // 返回 ["a", "b", "c", "123", "aa", "bb"];不破坏原来的数组

8、splice() 数组截取、添加、删除、替换; -- 破坏原数组;返回截取部分的元素

1. 截取

splice(2,2); 从下标为2开始,截取2个元素

  1. var arr = ['a','b','c','123','aa'];
  2. console.log(arr.splice(2,2)); // 返回 ["c", "123"]
  3. console.log(arr); // 返回 ["a", "b", "aa"],原数组被改变

splice(2); 从下标为2开始截取后面全部内容

  1. var arr = ['a','b','c','123','aa'];
  2. var arr = ['a','b','c','123','aa'];
  3. var newArr1 = arr.splice(2);
  4. console.log(newArr1); 返回["c", "123", "aa"]

2. 添加

  1. var arr = ['a','b','c','123','aa'];
  2. console.log(arr.splice(4,0,'abc')); // 返回 [],在下标为4的前面添加 abc
  3. console.log(arr); // 返回["a", "b", "c", "123", "abc", "aa"]

3. 替换

  1. var arr = ['a','b','c','123','aa'];
  2. console.log(arr.splice(4,1,'bb')); // 返回 ["aa"],将下标为4的替换成 bb
  3. console.log(arr); // 返回 ["a", "b", "c", "123", 'bb']

4. 删除

删除一个

  1. var arr = ['a','b','c','123','aa'];
  2. console.log(arr.splice(3,1)); // 返回 ["123"],删除下标3的元素
  3. console.log(arr); // 返回 ["a", "b", "c", "aa"]

删除二个

  1. var arr = ['a','b','c','123','aa'];
  2. console.log(arr.splice(2,2)); // 返回 ["c", "aa"],从下标2开始,删除两位
  3. console.log(arr); // 返回 ["a", "b"]

5. 使用splice将稀疏数组变成不稀疏:

思路:将undefined删除掉

  1. var index = [1,2,,,,,4];
  2. for(var i = 0; i < index.length ;i++){
  3. if(index[i] == undefined){
  4. index.splice(i,1);
  5. i--; // 下标为i的元素被删除,所以需要i--来获取因删除而往前进的元素
  6. }
  7. }
  8. console.log(index); // 返回 1,2,4

多维数组:数组中还是数组

用[][]方式访问多维数组内的元素

  1. var index = [[1,2,4], [4,5,6], ['a','b','c'], ['aa','bb']];
  2. console.log(index); // 返回 [Array[3], Array[3], Array[3], Array[2]]
  3. console.log(index.length); // 返回 4
  4. console.log(index[3][1]); // 返回 bb

类数组对象 arguments :

arguments 不是数组,不具有数组的方法

  1. function demo(){
  2. console.log(arguments); // 返回 [1, 2, 9, 8, 6, 4]
  3. // console.log(arguments.reverse()); // 报错,不具有数组的方法
  4. }
  5. demo(1,2,9,8,6,4);

元素的集合,获取一组元素

获取所有的li:

  1. var list = document.getElementsByTagName('li');
  2. console.log(list);
  3. // console.log(list.reverse()); 不具有数组的方法

获取ul中的li:

  1. var ul = document.getElementById('ulContent');
  2. var lis = ul.getElementsByTagName('li');
  3. console.log(lis);

元素的集合的遍历: --推荐使用for循环

1、for 遍历:

  1. for(var i = 0;i < list.length;i++){
  2. console.log(list[i]);
  3. }

2、for in 遍历: -- 会将不需要的内容遍历出来

  1. for(var i in list){
  2. console.log(i, list[i]);
  3. }

自定义的类数组

  1. var obj={}
  2. for(var i = 0; i < 5; i++){
  3. obj[i] = i*i;
  4. }
  5. console.log(obj); // 返回 Object {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, length: 5}

作为数组使用的字符串:

  1. var str = 'abcdefghijklmnopqrstuvwxyz';
  2. console.log(str[0]); // 返回 a
  3. console.log(str[1]); // 返回 b
  4. str[0] = 'b'; // 不能修改
  5. console.log(str); // 返回 abcdefghijklmnopqrstuvwxyz

作者 wendy
2019 年 5月 23日

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注