数组(Array)

1. 基础知识

1. 创建数组

 1)当构造函数只有一个参数,参数代表数组长度

  new Array(length)
//  或者 
 Array(length)

    length只能是>=0的整数

new Array(3); // [empty *3]
Array(3); // [empty * 3]

2)构造函数有多个参数时,参数为数组的初始值

new Array(1,2) ; // [1,2]
Array(1,2); // [1,2]

3) 推荐: 使用[]

var arr = [1,2,]; // [1,2] 数组的最后一个逗号可以忽略

4) 使用Array.of(参数), 不管参数个数有几个,参数都是数组的初始值

Array.of() ; // []
Array.of(3); // [3]
Array.of(1,2); //[1,2]

2. 数组键值

 1) a[0] 相当于 a['0']

   a[1.00] --> a['1'] --> a[1]

   2) 如果键值大于数组长度,或者为负数,系统自动将其转为数组对象的字符串属性,

   不再是数组的值。  

var arr = [];
arr[-1] = 5; // 数组对象的属性名为“-1”
arr[2**32] = 34; // 数组对象的属性名为“4294967296”
// [-1: 5, 4294967296: 34]
arr.length;// 0

3.length属性

  1) length = 最大的整数key + 1

  2) length最大值是2**32 - 1,数组长度大于该值报错:RangeError

var arr=[];
arr.length = 2**32; // Uncaught RangeError: Invalid array length

4. in运算符

1) 数字键既可以使用数字,也可以使用字符串

var arr=[1];
'0' in arr; // true
0 in arr;// true

2) 如果是空位,empty,in运算符返回false

var arr = Array(1); // [empty]
var arr2 = [,]; // [empty]
0 in arr; //false
0 in arr2; // false

5.空位

1)空位的产生

注意undefined不是空位

 1  构造函数生成
   Array(2); // [empty*2] 2  两个逗号之间为空
   [,]; // [empty] 3  delete属性删除某个数组的值之后
  var a =[1,2,3];
  delete a[1];
  a; // [1,empty, 3]

2)空位的遍历

forEach, for...in..., Object.keys(),some(), every(),flat()都会忽略空位;

var arr= Array(3);
arr.forEach(i => {
    console.log(i);
});
// 没有任何输出

map会保留空位

var arr=[1,,4];
arr.map(i => i*2); // [2,,8]

3)空位的填补(将empty转为undefined)

var arr=Array(3);
1. Array.from()方法
Array.from(arr); // [undefined, undefined, undefined]
2. 扩展运算符方法
[...arr]; //[undefined, undefined, undefined]

2. 静态方法

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

Array.isArray([]);// true

Object(obj) === obj可以判断是否是对象

3. 实例方法--- 改变原数组

1. push(param)/push(param1,param2,.....)

  改变原数组,从尾部添加;返回数组长度

var arr=[4];
arr.push(1,2,3); // 4
arr; // [4,1,2,3]

2. unshift(param)/ unshift(param1, param2,...)

  改变原数组,从头部添加;返回数组长度

var arr=[4];
arr.unshift(1,2,3); // 4
arr; // [1,2,3,4]

3.   pop() :没有参数

改变原数组,从尾部删除一个数据;返回删除的数据

var arr=[1,2,3,4];
arr.pop(); // 4
arr;// [1,2,3]

4.shift(): 没有参数

改变原数组,从头部删除一个数据;返回被删除的数据

var arr=[1,2,3,4];
arr.shift(); // 1
arr;// [2,3,4]

5. splice(start, length, addval1,addval2,...)

改变原数组;

当length>0时,从start开始删除,然后将后面的参数插入;返回被删除的数据

当length==0时,从start位置插入,不删除任何数据;返回空数组

当length<0时,不删除,返回空数组;

当start <0时,从倒数位置数;

当length不存在时,默认从起始位置到结束位置,相当于将数组分成两部分;

var arr=[1,2,3,4];
arr.splice(1,1,5); // [2] 删除2,插入5
arr; // [1,5,3,4]
arr.splice(1,0,6); // [] 不删除,插入6
arr;//[1,6,5,3,4]
arr.splice(3); // [3,4] 只删除,不插入
arr; // [1,6,5]

6. reverse()

改变原数组,返回反转后的数组

var arr=['a', 'b'];
arr.reverse(); //['b','a']
arr; //['b', 'a']

7.sort()/sort(function)

默认按照字典顺序排序,即所有的元素按照字符串排序;

还可以传入排序函数,进行自定义排序;

返回排序后的数组,原数组改变

[1001,101,111].sort(); // [1001,101,111]
// 按照字符串排序的规律进行排序

// 自定义排序函数,按照数值的升序排列
// 函数返回值>0,第二个在前;其余情况都是第一个在前
let arr=[1001,101,111];
arr.sort((a,b) => a-b); // [101,111,1001]
arr;//[101,111,1001]

8. copyWithin(overwriteStart, start=0, end=length)

将[start, end)的数据从第一个参数开始覆盖;返回覆盖后的数组

如果overwriteStart为负数,则从后面开始数;

var arr=[1,2,3,4];
arr.copyWithin(0, 3, 4); // [4,2,3,4]

9.fill(value, start, end)

改变原数组,从start到end被value值填充;返回修改后的数组

如果填充的是对象或者数组,相当于填充地址,一个修改全部修改;

var arr=Array(3);
arr.fill(7); // [7,7,7]
arr.fill(8, 0, 1); //[8,7,7]
arr.fill({a:1}); //[{a:1},{a:1},{a:1}]
arr[0].a = 5;
arr; // [{a:5},{a:5},{a:5}]

4.实例方法--查找/判断数组元素

1. indexOf(value, start)

查找出现的第一个元素,不存在返回-1;

start为负数,倒数

2.lastIndexOf(value, start)

查找出现的最后一个位置,不存在返回-1

3. some(function, thisObj)

判断元素是否存在符合function的条件,是返回true,否则false

var arr=[1,2,3];
arr.some((item,index,arr) => {
   return item>2
}) ;// true

4. every(function, thisObj)

判断是否每个元素都符合funtion的条件,是返回true,否则false

var arr=[1,2,3];
arr.every((item,index,arr) => {
   return item>2
}) ;// false

5.find(function)

传入一个函数作为查找条件,返回查找的结果或者undefined;

功能同indexOf();但是可以查找NaN

6. findIndex(function)

返回查找到的元素所在的index或者-1;

功能同indexOf(); 但是可以查找NaN

7. includes(value)

查找元素是否存在;返回布尔值;

可以查找NaN

5. 实例方法--数组转字符串

1. toString()

会将null, undefined,空位转为空字符串''

但是NaN转为"NaN"

返回以,逗号分割的字符串

[1,2,null,undefined,4].toString(); // "1,2,,,4"

2. join(分割符)

将数组元素以分隔符连接,返回连接后的字符串;

同样将null,undefiend处理成空字符串

如果没有参数,分隔符默认是逗号(,)

[1,2,null,undefined,4].join();// "1,2,,,4"
[1,2,null,undefined,4].join("|"); // "1|2|||4";

6. 实例方法--遍历数组

遍历数组可以使用for,while语句,也可以使用一些内置函数遍历

1. forEach(function, thisObj)

1)会跳过空位,不会跳过undefined和null

2)不返回任何值

2. map(function, thisObj)

1) 会跳过空位,不会跳过undefined和null

2)返回遍历处理过的数组

map方法有时会改变原数组,一般是参数是对象的时候

var a = [{a:1}, {a:2}, {a:3}];
// 遍历的时候,直接改变当前元素的值,会修改原数组
var newArr = a.map((item,index,arr) => {
    item.b = "add";
    return item;
});
newArr;  // [{a: 1, b: "add"}, {a: 1, b: "add"}, {a: 1, b: "add"}]
a; // [{a: 1, b: "add"}, {a: 1, b: "add"}, {a: 1, b: "add"}]
// 如果想避免这种修改原数组的情况,可以将当前元素重新赋值
var newArr = a.map((item,index,arr) => {
    const obj = {...item}; // 浅拷贝
    obj.b = "add";
    return obj;
});
newArr; // [{a: 1, b: "add"}, {a: 1, b: "add"}, {a: 1, b: "add"}]
a; // [{a:1}, {a:2}, {a:3}];

3. filter(function, thisObj)

返回过滤后的新数组

可以使用filter(Bollean)返回布尔值是true的元素

4. reduce(function, initialValue, thisObj)

累计处理数组,可以用来求数组的和

function有四个参数(a,b,index,arr);

当initialValue没有值时,a代表数组第一个元素,b代表数组第二个元素

5.reduceRight(function, initialValue, this.obj)

6.entries() keys() values()

三者都是对数组的遍历。返回的是遍历器对象!!

// entries()是对键值对的遍历
for(let [key,value] of ['a','b'].entries()) {
    console.log(key, value);
}
// 0 'a'
// 1 'b'
for(let keyValue of ['a','b'].entries()) {
    console.log(keyValue);
}
// [0, "a"]
// [1, "b"]

['a','b'].entries().next(); 
//{value: [0,"a"], done: false}


// keys()是对键名的遍历
[...['a','b'].keys()] ; // [0,1]

// values()是对值的遍历
[...[,'a',null]]; // [undefined, 'a', null]

7.实例方法---不改变原数组

1.concat(val1, val2)

参数可以是任意类型的值,返回拼接后的新数组。

var arr=['a', 'b'];
arr.concat('c'); //['a','b','c']
arr; // ['a','b']
arr.concat(['c'], 'd'); // ['a','b','c','d']

2.slice(start, end)

和字符串用法相同

3.flat()/flat(n)

将数组拉平,如果无参数,默认拉平一层;传入n,拉平n层;

如果想拉平所有的层,可以简单使用flat(Infinity)

var arr = [1,[2,[3]]];
arr.flat(); // [1,2,[3]]
arr; // [1,[2,[3]]];
arr.flat(2); //[1,2,3]
arr.flat(Infinity); //[1,2,3]

4. flatMap(function)

原数组不变;对数组使用map方法后拉平,只能拉平一层!

var arr=[1,2,4];
arr.flatMap((item) => [[item]]); //[[1],[2],[4]]
arr; // [1,2,4];

8. 类数组/Iterator接口对象转数组

类数组对象唯一的要求是有个length属性;{length: 3}

Iterator接口对象是部署了Iterator接口的对象;如Set

arguments,NodeList,字符串两种对象都属于。

1.使用slice()方法

只能将类数组对象转为数组;不能将遍历器接口对象转为数组

[].slice.call({length:3}); //[empty*3]

2.扩展运算符(...)

只能将遍历器接口对象转为数组;类数组对象不行

[...new Set([1,2,4])]; //[1,2,4]

3.Array.from(params)

既可以处理类数组对象,也可以处理遍历器接口对象

let arrayLike = {
    '0': 'a',
    '1': 'b',
    '2': 'c',
    length: 3
};
Array.from(arrayLike); // ['a','b','c']
Array.from(new Set([1,1,3])); // [1,3]

  

原文地址:https://www.cnblogs.com/lyraLee/p/11649233.html