创建数组
new Array
var arr = new Array();var arr = new Array(10); // 10为个数var arr = new Array(1,2,3,4); // 效果同var arr = [1,2,3,4];
[ ]
var arr = [1,2,3,4];
增删元素
let number = [0,1,2,3,4,5,6,7,8,9];
添加元素
在数组末尾添加元素
1.numbers[numbers.length] = 10;2.numbers.push(10,11);***push改变数组,返回push后的长度***var arr = [1,2,3];var arr2 = arr.pus(4,5);console.log(arr); // [1,2,3,4,5];console.log(arr2); // 5
在数组开头添加元素
1.let number = [1, 2, 3, 4, 5, 6, 7];Array.prototype.insertFirstPosition = function (value) {console.log("start", this);for (let i = this.length - 1; i >= 0; i -= 1) {this[i + 1] = this[i];}this[0] = value;};number.insertFirstPosition(-1);console.log(number);// [-1,1,2,3,4,5,6,7]2.number.unshift(-1,0);***unshift改变数组,unshift返回数组长度***const res = number.unshift(-1,0);console.log(number); // [-1, 0, 1, 2, 3, 4, 5, 6, 7]console.log(res); // 9
方法1知识点:若多数数组都需调用此方法,可直接将方法写入数组原型中,用this指代数组(注意,insertFirstPosition不能用箭头函数,因此箭头函数的this指向不为number数组。)
Tips: 使用splice添加元素number.splice(2,4,9876,6789),
从下标2的位置开始,删除4个,返回的值为被删除的这四个值**。
在下标2的位置开始,添加9876和6789
let number = [1, 2, 3, 4, 5, 6, 7];const res = number.splice(2,4,9876,6789);console.log(res); // [3, 4, 5, 6]console.log(number); // [1, 2, 9876, 6789, 7]
删除元素
在数组末尾删除元素
number.pop();***pop改变数组,返res回被删除的那个值***const res = number.pop();console.log(number); // [1, 2, 3, 4, 5, 6]console.log(res); // 7,返回被pop的那个值。
tips: 使用splice删除末尾几个
若想删除末尾多个,可使用number.splice(-3),来改变原数组,且根据返回值获取后三个值。
附:使用number.slice(-3),不改变原数组,返回值为后三个值。
在数组开头删除元素
number.shift();***shift改变数组,res返回被删除的那个值***const res = number.pop();console.log(number); // [2, 3, 4, 5, 6, 7]console.log(res); // 1,返回被shift的那个值。
使用遍历移动数组:
- 删除数组开头的元素,可使用遍历将数组全部后移一位,此时数组长度不变,会有一项为undefined,这时需要重新format数组,删除空值,增删都不建议使用遍历,推荐用数组方法。
- delete运算符可以删除元素,但是
delete number[0],实质上是将number[0]置为undefined。
二维or多维数组
JavaScript不支持矩阵,但可以通过数组套数组,实现矩阵或任一多维数组。
var arr = [];arr[0][0]=1; // VM2602:1 Uncaught TypeError: Cannot set property '0' of undefinedarr[0] = [];arr[0][0] = 1;
JavaScript的数组方法参考
数组合并
不改变参与合并的数组本身,返回一个新数组。
var a = [1,2,3];var b = [4,5,6];var c = [];var d = c.concat(a,b);console.log(a); // [1, 2, 3]console.log(b); // [4, 5, 6]console.log(c); // []console.log(d); // [1, 2, 3, 4, 5, 6]
迭代器函数

var arr = [9,8,7,6,5,4,4,3,2,1,2,3,4,5,6,7,8,9];undefinedarr.indexOf(7); // 2arr.lastIndexOf(7); // 15arr.toString(); // "9,8,7,6,5,4,4,3,2,1,2,3,4,5,6,7,8,9"arr.valueOf(); // [9,8,7,6,5,4,4,3,2,1,2,3,4,5,6,7,8,9],结果上来看,和toString()不一样。
ES6的数组新特性
for…of
迭代中无法修改原数组,因此建议写成**const n in number**。
let number = [1,2,3,4,5,6,7];for(const n of number) {console.log(n % 2 === 0 ? 'even' : 'odd');}
使用@@iterator对象
let number = [2,2,1,2,3,4,5,6,7];let iterator = number[Symbol.iterator]();iterator.next().value; // 2iterator.next().value; // 2iterator.next().value; // 1iterator.next().value; // 2iterator.next().value; // 3...*** for..of此时可以结合iterator使用 ***let number = [2,2,1,2,3,4,5,6,7];let iterator = number[Symbol.iterator]();for(const n of iterator) {console.log(n);}
entries/key/values (不同于Object的方法)
entries 返回包含键值对的@@iterator
let myarr = [5,8,1,5,1,0,3];const entry = myarr.entries();console.log(entry); // Array Iterator {}entry.next().value; // [0, 5]entry.next().value; // [1, 8]entry.next().value; // [2, 1]entry.next().value; // [3, 5]*** 也可以使用for...of ***for(const n of entry) {console.log(n);}
key 返回包含数组索引的@@iterator
myarr; // [5, 8, 1, 5, 1, 0, 3]const keys = myarr.keys();console.log(keys); // Array Iterator {}keys.next() // {value: 0, done: false}keys.next() // {value: 1, done: false}keys.next() // {value: 2, done: false}keys.next() // {value: 3, done: false}keys.next() // {value: 4, done: false}keys.next() // {value: 5, done: false}keys.next() // {value: 6, done: false}keys.next() // {value: undefined, done: true},没有可迭代的值时会返回此结果。
values 返回包含数组的值的@@iterator
myarr; // [5, 8, 1, 5, 1, 0, 3]const values = myarr.values();values.next(); // {value: 5, done: false}values.next(); // {value: 8, done: false}values.next(); // {value: 1, done: false}values.next(); // {value: 5, done: false}values.next(); // {value: 1, done: false}values.next(); // {value: 0, done: false}values.next(); // {value: 3, done: false}values.next(); // {value: undefined, done: true}
Array.from(arr,fun)
fun参数选填,是用来format数组的函数。
const myarr = [2,1,5,7,1,2,1,6];const arrFrom = Array.from(myArr);arrFrom; // [2, 1, 5, 7, 1, 2, 1, 6]myArr; // [2, 1, 5, 7, 1, 2, 1, 6]*** Array.from(myArr, fun) ***let evens = Array.from(myArr, x => x%2 === 0);evens; // [true, false, false, false, false, true, false, true]myArr; // [2, 1, 5, 7, 1, 2, 1, 6]let evens = Array.from(myArr, x => x+1);evens; // [3, 2, 6, 8, 2, 3, 2, 7]
Array.of(…)
参数为一堆数值,而非一个数组
const arr = Array.of(1,2,3,4);arr; // [1, 2, 3, 4]
fill(n,index,endIndex)
填充数组,n为需要填充的内容,
index选填,表示开始替换的下标,
endIndex选填,为结束的下标,若有index,endIndex默认为填充到最后。
区间左闭右开。
const arr = Array.of(1,2,3,4);arr; // [1, 2, 3, 4]arr.fill(0);arr; // [0, 0, 0, 0],虽然此处用了const,但因为是引用变量,此处可以成功修改。const arr = [9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]arr.fill(0,2,6);arr; // [9, 8, 0, 0, 0, 0, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copyWithin
let copyArray = [1, 2, 3, 4, 5, 6];copyArray.copyWithin(0, 3); // [4, 5, 6, 4, 5, 6]copyArray = [1, 2, 3, 4, 5, 6];copyArray.copyWithin(1, 3, 5);这种情况下,会把从位置 3 开始到位置 5 结束的元素复制到位置 1,结果 是得到数组[1, 4, 5, 4, 5, 6]。
排序
反序
自定义排序
数字排序,sort默认成字符串比较,直接sort()后11可能排在2前。
numbers.sort((a, b) => a - b);在 b 大于 a 时,这段代码会返回负数,反之则返回正数。如果相等的话,就会返回 0。也就是说返回的是负数,就说明 a 比 b 小,这样 sort 就能根据返回值的情况对数组进行排序。 之前的代码也可以表示成如下这样,会更清晰一些。
let friends = [{ name: "John", age: 30 },{ name: "Ana", age: 20 },{ name: 'Chris', age: 25 },];function comparePerson(a, b) {if (a.age < b.age) {return -1;}if (a.age > b.age) {return 1;}return 0;}console.log(friends.sort(comparePerson));/*** res[{ name: 'Ana', age: 20 },{ name: 'Chris', age: 25 },{ name: 'John', age: 30 }]*/
字符串排序
JavaScript 在做字 符比较的时候,是根据字符对应的 ASCII 值来比较的,导致大写的J会排在小写的a前面。
我们可在上方的sort中加入toLowerCase(),但无法区分A和a。
如果希望小写字母排在前面,那么需要使用 localeCompare 方法。
names.sort((a, b) => a.localeCompare(b));// ["ana", "Ana", "john", "John"]
搜索
indexOf(value)、lastIndexOf(value)
indexOf(value); // indexlastIndexOf(value); // last index
找不到对应的值返回-1。
const arr = [9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9];arr.indexOf(7); // 2arr.lastIndexOf(7); // 15
ES6: find(fun)、findIndex(fun)
value作为参数会报错,参数为回调函数。find(func);返回第一个满足条件的值,找不到返回undefined。findIndex(fun);返回第一个满足条件的值的索引,找不到返回-1。
arr;(18) [9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]arr.find(i => i%2 === 0); // 8arr.findIndex(i => i%2 === 0); // 1
ES7: includes(value)
includes(value,index),查找index之后(包括index)是否存在value,
index选填,默认从头开始查找,存在这个元素返回true,不存在返回false。
arr; // [9, 8, 7, 6, 5, 4, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9]arr.includes(9); // truearr.includes(99); // falsearr.includes(000000001); // truearr.includes(7,15); // truearr.includes(7,16); // false
arr.toString()和arr.join(‘’)
arr.toString(); // "9,8,7,6,5,4,4,3,2,1,2,3,4,5,6,7,8,9"arr.join(); // "9,8,7,6,5,4,4,3,2,1,2,3,4,5,6,7,8,9"arr.join(''); // "987654432123456789arr.join('-'); // "9-8-7-6-5-4-4-3-2-1-2-3-4-5-6-7-8-9"
类型数组
let myArray = new TypedArray (length),其中 TypedArray 需替换为下表所列之一。
let length = 5;let int16 = new Int16Array(length);let array16 = []; array16.length = length;for (let i=0; i<length; i++){ int16[i] = i+1;}console.log(int16);
TS中的数组
interface Person {name: string;age: number;}// const friends: {name: string, age: number}[];const friends = [{ name: 'John', age: 30 },{ name: 'Ana', age: 20 },{ name: 'Chris', age: 25 }];function comparePerson(a: Person, b: Person) {// comparePerson 函数的内容}
