~定义方式
let arr=[1,2] //字面量创建
let arr2=new Arrery() //构造函数创建
~间隔推入数组
let arr=[1,2,3]
arr[10]=10
arr

let arr=[1,2,3]
arr[10]=11
for(let i of arr){
console.log(i)
}

~数组的本质
本质上数组是一种特殊的对象,typeof查看其基本类型返回 object
typeof [] //object
数组的特殊性在于,他的键名是按次数排列的整数。
let arr=[1,2,3]
Object.keys(arr)
//['0','1','2']
上面的代码我们可以看到,object的键名方法arr是可以使用的,返回的也是整数
let arr=[1,2,3]
arr[0] //1
arr['0'] //1
按照对象的写法 obj['key'] 括号里必须是字符串,而数组却不需要。之所以可以是非字符串键名转化为字符串
~length属性
通过length控制数字的数据
let arr=[1,2,3]
arr.length=2
arr //[1,2]
如果人为设置的length大于数组实际的长度,数组成员的数量会增加到这个值,新增的位置都是空位
let arr=[1,2,3]
arr.length=10
arr[7] //undefined
~为数组添加属性
数组本质是对象,所以可以为数组添加属性,但这不影响length属性
let arr=[
1,2,3,4
]
arr['a']='ss'
arr['b']='ss'

~ in运算符
检测某个键名是否存在,适用于对象,也适用于数组
let arr=['v',2,4,‘a’]
0 in arr //true
'1' in arr //true
4 in arr //false
数值也会转为字符串,如果数组某个位置为空,in将返回false
let arr=[]
arr[100]=1
100 in arr //true
1 in arr //false
~for in 循环遍历数组
以为数组也是特殊的对象,所以可以可以用for in 遍历数组
let arr=[1,2,3]
for(const i in arr){
i // key
arr[i] //value
}
但是需要注意的是for in 会将数组中的属性也会遍历出来




~数组的空位
当数组中两个逗号之间没有值,即为数组中的空位
let arr=[1,,2]
arr.length //3
空位是可以读取的
let arr=[,,,]
arr.length //3
arr[0] //undefined
使用delete命令删除一个数组元素,会形成空位影响length属性
let arr=[1,2,3]
delete(arr[0]) //true
arr[0] //undefined
arr.length //3
数组某个位置是空位与其是undefined是不一样的,如果是空位for in Object.keys方法遍历是会跳过的
var a = [, , ,];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
})
// 不产生任何输出
for (var i in a) {
console.log(i);
}
// 不产生任何输出
Object.keys(a)
// []
如果某个位置是undefined
,遍历的时候就不会被跳过。
var a = [undefined, undefined, undefined];
a.forEach(function (x, i) {
console.log(i + '. ' + x);
});
// 0. undefined
// 1. undefined
// 2. undefined
for (var i in a) {
console.log(i);
}
// 0
// 1
// 2
Object.keys(a)
// ['0', '1', '2']
~ Array.isArray()
isArray()方法返回一个布尔值,用来判断参数是否是数组。(弥补typeof的问题)
Array.isArray([]) //true
typeof [] //object
~valueOf() , toString()
valueOf方法是一个所有对象都拥有的方法,表示该对象求值。不同对象的valueOf方法不尽一致,数组的方法是返回数组本身
let arr=[1,2,3]
let obj={name:11,dd:2}
function fun(){}
let zhen=/a/
console.log(arr.valueOf(),obj.valueOf(),fun.valueOf(),zhen.valueOf())

toString方法也是对象的通用方法,用来返回数组的字符串形式
let arr=[1,2,3]
let obj={name:11,dd:2}
function fun(){}
let zhen=/a/
console.log(arr.toString(),obj.toString(),fun.toString(),zhen.toString())

~push() , pop()
push方法用来向数组末尾追加元素。会改变原数组
let arr=[]
arr.push(1) // 1
arr.push('a') // 2
arr.push(true, {}) // 4
arr // [1, 'a', true, {}]
pop方法用来删除数组最后一个元素,并且返回他,改变原数组
let arr=[1,2]
arr.pop() //2
arr //[1]
~shift() , unshift()
shift方法用于删除数组第一个元素
let arr=[1,2,3]
arr.shift() //1
arr //[2,3]
unshift方法用于向数组头部追加一个元素,会改变原数组,并且返回新数组的length
let arr=[1,2,3]
arr.unshift('x',6) //5
arr //['x',6,1,2,3]
~join()
join方法可以用指定字符作为分隔符,将数组连接为一个字符串。不提供参数默认以 , 逗号分割
let arr=[1,2,3]
arr.join() // '1,2,3'
arr.join('') // '123'
用call分割伪数组的对象
let obj={
0:12,
1:33,
length:2
}
[].join.call(obj,' ') // '12 33'
~concat()
concat方法用来合并数组。他将新成员添加到数组后部,返回一个新数组,原数组不变
let arr= [1].concat([2,3])
arr //[1,2,3]
let arr= [1].concat([2,3],[4,5])
arr //[1,2,3,4,5]
参数除了接收数组,也可以接收其他类型的参数
let arr=[1,2].concat(3,4)
arr //[1,2,3,4]
let arr=[1,2].concat({name:123})
arr //[1,2,{name:123}]
如果参数中带有对象,concat返回一个浅拷贝,只是拷贝原对象的引用
let obj={name:123}
let arr=[1,2].concat(obj)
arr[2].name=333
obj // {name:333}
~reverse()
reverse方法方法用来颠倒数组
[1,2,3].reverse() //[3,2,1]
~slice()
slice方法用来截取数组,返回一个新数组,原数组不变,string也可以用
第一个参数从哪开始,第二参数结束位置。没有第二个参数截取完
let arr=[1,2,3]
arr.slice(1) //[2,3]
arr.slice(1,1) //[2]
arr // [1,2,3]
slice一个重要的作用就是把类数组转化为真正的数组
[].slice.call({0:12,1:22,length:2}) //[12,22]
[].slice.call(doucument,querySelectorAll('div'))
~splice()
splice方法用来删除数组元素,也可以用来添加新元素,会改变原数组
第一个参数是删除的起始位置,第二个是删除元素的个数,第三个是在删除的位置追加的元素
let arr=[1,2,3]
arr.splice(0,1)
arr //[2,3]
arr.splice(0,0,3,3)
arr //[3,3,2,3]
~sort()
sort方法用来对数组进行排序,默认是按照字典顺序进行排序。排序后原数组将会改变
['d','a','c','b'].sort() //[a,b,c,d]
[4,2,3,1].sort() //[1,2,3,4]
sort()方法可以将一个函数传入当作参数,第一个参数是第二个比较的值,第二个参数是第一个比较的值
[1,2,3,4,5,6].sort((two,one)=>{
console.log(two,one)
})

[10111, 1101, 111].sort(function (a, b) {
return a - b; //a - b是升序
return b - a; //b - a是降序
})
// [111, 1101, 10111]
// [10111, 1101,111]
~map()
map方法将将数组成员一次传入函数,然后把每一次的执行结果组成一个新数组返回
函数传入三个参数(当前元素,下标,原数组)
let arr=[1,2,3]
let x=arr.map(function(item){
return item+1
})
console.log(arr) //[1,2,3]
console.log(x) [2,3,4]
map第二个参数可以传入this
let arr2=[]
let arr=[1,2,3]
function fun(v,i,arr){
this[i]=v
}
arr.forEach(fun,arr2)
console.log(arr2) //[1,2,3]
~forEach()
foreach与map很像,但是foreach没有返回值,只是为了操作数据。如果想返回新数组使用map
function log(element, index, array) {
console.log('[' + index + '] = ' + element);
}
[2, 5, 9].forEach(log);
forEach也可以传入this和map一样
~filter()
filter方法用于过滤数组成员,满足条件的组成一个新的成员返回
它的参数是一个函数,所有数组成员依次执行该函数,返回结果为 true 的成员组成一个新数组返回
它也可以传this
~some() every()
some与every判断传入数组的每一项,some中有一个符合条件,就返回true,every则必须全部符合条件 才返回true
var arr = [1, 2, 3, 4, 5];
arr.some(function (elem, index, arr) {
return elem >= 3;
});
// true
var arr = [1, 2, 3, 4, 5];
arr.every(function (elem, index, arr) {
return elem >= 3;
});
// false
~reduce() reduceRight()
reduce方法和reduceRight依次处理数组成员,最终累计一个最终值返回。reduce是从左往右处理成员,right相反。
let num=[1,2,3,4,5].reduce((a,b)=>{
console.log(a,b)
return a+b
})
num //15

reduce((a,b,index,arr)=>{}) reduce和reduceRight 传入的函数有四个参数
function max(arr){
return arr.reduce((a,b)=>{
return a.length>b.length?a:b
})
}
console.log(max(['a','bbb','cc'])) //bbb
reduce 用来比较数组中特定的值比较好
~indexOf() lastIndexOf()
这两个返回查找元素,在数组的位置,用法和字符串使用一样
['a','g','s'].indexOf('g') //1
['a','g','s'].indexOf('x') //-1 -1没找到
~链式使用
var users = [
{name: 'tom', email: 'tom@example.com'},
{name: 'peter', email: 'peter@example.com'}
];
users.map((item)=>{
return item.email
})
.filter((email)=>{
return /^t/.test(email)
})
.forEach((item)=>{
console.log(item) // tom@example.com
})