数组

@Array
更多应用,请访问 Array
声明
直接赋值创建或构造函数创建
let arr0 = [1, 2, 3];
let arr1 = new Array(1, 2, 3);
console.log(arr0, arr1);
属性
1. index
数组元素的位置,从0开始
2. length
数组长度
可以任意赋值:少于实际个数,数据会丢失,但是数据仍然在内存中;多于实际个数,值为undefined
赋值
1. 引用赋值 =
将变量指向新的引用/地址空间;多个变量引用|指向同一块内存;一个变量对内存数据的修改会影响到另外一个变量;一个变量重新赋值时,会丢失原来的内存
let arr0 = [1, 2];
let arr1 = arr0;
arr1.push(3)
arr0 = [1, 3];//指向别的内存
2. 解构赋值 []
一次性把数组元素赋值给多个变量
let [a, b] = [1, 3];
指定位置赋值 - 获取最后一个
let [, , , , a] = [1, 2, 3, 4, 5];
//a=5
交换赋值
[a, b] = [b, a];
...剩余赋值 - 第1个给a,其它给rest;剩余属性必须是模式中的最后一个,并且不能有尾随逗号
let [a, ...rest] = [1, 2, 3, 4, 5]
//a=1
//rest=[2,3,4,5]      
默认赋值 - 位置要匹配
let [name, age = 18, gender] = ['gl', , 'male']
let [name, age = 18] = ['gl']
3. 扩展运算符 ...
将数组各项展开,适合数组复制
let a = [1, 2, 3];
let b = [...a];
如何清空数组?
Static methods
from()
.将一个类数组对象或者可遍历对象转换成一个真正的数组
1. 类数组
.使用获取多个元素方法,如 querySelectorAll(),得到的元素集合都是类数组对象,最基本的特点就是具有length属性的对象;如果没有长度属性,会被转化为一个空数组
2. set集合
.无重复数据的集合
3. 字符串
.将字符串拆分成单个字符的数组
isArray()
是否是一个数组
所有的数组都是对象,所以直接使用 typeof 返回的是 object
console.log(typeof [1, 2]);//object
console.log(Array.isArray([1, 2]));//true
Instance methods
.数组既有栈的行为函数也有队列的行为函数
.栈行为:先进后出 FILO;尾端操作;push()、pop()
.队列行为:先进先出 FIFO;头出尾进:push()、shift();使用 unshift()和 pop() 方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项
push()
.添加元素到数组末尾
unshift()
.添加元素到头部
pop()
.移除数组末尾元素并返回
shift()
.移除数组头部元素并返回
concat()
.数组连接
.返回一个新数组
.不会修改原数组;不会去重
join()
.数组元素按照指定的分隔符连接为字符串
let arr0 = [1, 2, 3];
let arr1 = [3, 4, 5];
console.log(arr0.concat(arr1));//1, 2, 3, 3, 4, 5
console.log(arr0);//1, 2, 3
console.log(arr0.join('-'));//1-2-3
slice(start,end)
Returns a copy of a section of an array.
.取子串 - 选取串中位置|索引从 start 到 end 的部分;不包括 end
.返回:一个新的数组/字符串
.原数组:不变
.start不指定,从0开始;end 不指定,截取到末尾
.目标位置为负数时,反向截取;最后一位是-1;倒数第二位是-2,依次类推;可以用于获取后缀名;
.应用比较广泛
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let res = arr.slice(2, 4);
console.log(res);//3,4
console.log(arr);//不变
splice(start,count[,el...])
Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
.从原来数组中截取|删除指定长度的字符串
.返回:删除的数据项
.原数组:被修改
.在删除的基础上,还可以插入新的元素el;如果 count 为0,则不删除
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
let res = arr.splice(2, 2);
console.log(res);//[3,4]
console.log(arr);//[1,2,5,6,7,8,9]
arr.splice(2, 1, 8, 8);
console.log(arr);//[1,2,8,8,6,7,8,9];5被删除,插入|增加了2个8
要清楚每个函数有无返回?如果有的话,返回值是什么?原数组有没有破坏?
[] 洗牌 Shuffle
根据串/数组的长度,随机取一个位置值,然后将该位置的数据删除,形成一个新串/数组;重复执行到串/数组为空
每次删除的数据放到一个新数组中,保存起来;这个数组就是洗牌的结果
function shuffle(arr) {
  let tmp = [];
  while (arr.length > 0) {
    let rad = Math.floor(Math.random() * arr.length)
    tmp.push(arr[rad])
    arr.splice(rad, 1)
  }
  return tmp;
}