Array对象

65 阅读5分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情 是js的原生对象,同时也是一个构造函数,可以用来生成新的数组。

静态方法

Array.isArray()

返回一个布尔值,表示参数是否为是数组 实例方法

valueOf(),toString()

valueOf方法是一个所有对象都拥有的方法,表示对该对象求值。不同对象的valueOf方法不尽一致,数组的valueOf方法返回数组本身。

toString方法也是对象的通用方法,数组的toString方法返回数组的字符串形式。

push(),pop()

push()在数组末尾添加元素,返回新数组的长度,会改变原数组

pop(),删除最后一个元素,并返回该元素,会改变原数组

shift(),unshift()

shift()删除第一个元素,返回该元素,改变原数组

unshift()在第一的位置添加元素,返回新数组的长度,改变原数组

join()

以指定参数作为分隔符,将数组成员作为一个字符串返回,如果不提供参数,默认用逗号分隔

concat()

合并多个数组,将新数组成员添加到原数组的后部产生一个新数组,原数组不变

[1, 2, 3].concat(4, 5, 6)
// [1, 2, 3, 4, 5, 6]

如果数组成员包括对象,concat返回当前数组的一个浅拷贝。

  • 浅拷贝:拷贝的是对对象的引用,只复制对象的指针,不复制对象本身,共享一块内存,修改新对象旧对象也发生改变
  • 深拷贝:创建一个一模一样的对象,新对象和旧对象之间不共享内存,修改新对象旧对象不改变

reverse()

颠倒数组排列顺序,返回改变后的数组,改变原数组

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

slice()

截取目标数组的某一部分

arr.slice(start, end);

前包后不包

返回值为截取出来的元素的集合

原数组不发生改变

没有参数实际等于返回一个原数组的拷贝

var a = ['a', 'b', 'c']; 
a.slice(0) // ["a", "b", "c"] 
a.slice(1) // ["b", "c"] 
a.slice(1, 2) // ["b"] 
a.slice(2, 6) // ["c"] 
a.slice() // ["a", "b", "c"]

如果参数是负数,则表示倒数计算位置

var a = ['a', 'b', 'c']; 
a.slice(-2) // ["b", "c"] 
a.slice(-2, -1) // ["b"]

-2表示倒数计算的的一个位置

splice()

用于删除原数组的一部分元素,并可以在原数组位置添加新的元素,返回被删除的元素,会改变原数组

arr.splice()
  • 1.删除的起始位置
  • 2.被删除的元素个数
  • 后面还有参数的话表示要被插入的新元素

起始位置如果是负数,表示从倒数位置开始删除

如果只有一个参数,等同于将原数组拆成2个数组

var a = [1, 2, 3, 4]; 
a.splice(2) // [3, 4] a // [1, 2]

sort()

对数组元素进行排序

默认按照字典顺序排序,原数组将改变

默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的

可以按照自定义顺序排序可以传入一个函数作为参数。

参数函数本身接收2个参数,表示要进行比较的两个数组成员,如果返回值大于0,表示第一个字排在第二个值后面

var numbers = [4, 2, 5, 1, 3]; 
numbers.sort(function(a, b) {
return a - b; //升序 
return b - a;//降序 });
console.log(numbers);

[ 
{ name: "张三", age: 30 },
{ name: "李四", age: 24 },
{ name: "王五", age: 28 } 
].sort(function (o1, o2) { return o1.age - o2.age; }) 
// [ // { name: "李四", age: 24 }, 
// { name: "王五", age: 28 }, 
// { name: "张三", age: 30 } // ]

map()

将数组的所有元素依次传入参数函数。然后将每次的执行结果组成一个新的数组返回。

var numbers = [1, 2, 3];
numbers.map(function (n) {
return n + 1; 
}); // [2, 3, 4] numbers // [1, 2, 3]

原数组没有变化

map()接收一个函数作为参数(回调函数),该函数调用时,map()方法向他传入3个参数(回调函数的三个参数):当前元素,当前位置,数组本身。

[1, 2, 3].map(function(elem, index, arr) { 
return elem * index; 
}); // [0, 2, 6]

map()还接收第二个参数,用来绑定回调函数内部的this,将回调函数内部的this对象,指向第二个参数

var arr = ['a', 'b', 'c'];
[1, 2].map(function (e) { 
return this[e];
}, arr) 
// ['b', 'c']

forEach()

forEach和map类似,但是没有返回值,只用来操作数据,如果遍历数组的目的是为了得到返回值,那么使用map()方法,否则使用forEach()方法。

forEach也接受第二个参数,绑定参数函数的this变量。

注意,forEach()方法无法中断执行,总是会将所有成员遍历完。如果希望符合某种条件时,就中断遍历,要使用for循环。

filter()

过滤数组成员,满足条件的成员返回一个新的数组。

他的参数是一个函数,所有数组元素依次执行该函数。返回结果为true的元素组成一个新数组返回,该方法不会改变原数组。

[1, 2, 3, 4, 5].filter(function (elem) { 
return (elem > 3); 
})

filter方法的函数接受三个参数:当前元素,当前索引,整个数组

[1, 2, 3, 4, 5].filter(function (elem, index, arr) { 
return index % 2 === 0; 
}); // [1, 3, 5]

还可以接受第二个参数,用来绑定参数函数内部的this变量

var obj = { MAX: 3 }; 
var myFilter = function (item) { 
if (item > this.MAX) return true; }; 
var arr = [2, 8, 3, 4, 1, 3, 2, 9]; 
arr.filter(myFilter, obj) // [8, 4, 9]