<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//数组api
//菜鸟教程 https://www.runoob.com/jsref/jsref-obj-array.html
//1.concat 用于连接两个或多个数组,返回连接后的结果,不改变原数组
//所有浏览器都兼容
var arr1 = ["a", "b"];
var arr2 = ["c"];
var arr3 = ["d"];
var arr4 = arr1.concat(arr2) //连接两个数组,
var arr5 = arr1.concat(arr2, arr3) //连接三个数组
console.log(arr4, arr5)//(3) ["a", "b", "c"] (4) ["a", "b", "c", "d"]
console.log(arr1)
//一道题:传递两个参数m,n,返回长度为m,所有元素都为n的数组,要求不能用循环。 利用函数的递归和 concat() 方法可以实现,代码如下:
function fn(m, n) {
return m ? fn(m - 1, n).concat(n) : []
}
console.log(fn(5, 2))
//2.copyWithin 将数组的指定元素拷贝到另一个指定位置上
//直接改变原数组,数组长度不会发生变化
//ES6支持
//语法:array.copyWithin(target, start, end)
var arr6 = [1, 2, 3, 4, 5, 6]
// arr6.copyWithin(3,0)
// console.log(arr6);//[1,2,3,1,2,3]
arr6.copyWithin(2, 0, 2)
console.log(arr6);//[1,2,1,2,5,6]
//3.entries 返回数组的可迭代对象,该对象包含数组的键值对(key/value),key是数组索引,value是数组值
//不改变原数组
var arr7 = ["a", "b", "c"];
console.log(arr7.entries(), arr7)
//4.every 检测数组每个元素是否都满足条件
//返回true/false
//不改变原数组,不会对空数组进行检测
//当有一个元素不满足条件,就会返回false,且剩下的元素就不再进行检测了
//语法:array.every(function(currentValue,index,arr), thisValue)
//检测是否所有年龄都小于18
function fnEvery(ages) {
return ages.every((item, index, arr) => {
console.log(item, index, arr)
// 12 0 (5) [12, 17, 19, 15, 16]
// 17 1 (5) [12, 17, 19, 15, 16]
// 19 2 (5) [12, 17, 19, 15, 16]
return item < 18
})
}
var ages = [12, 17, 19, 15, 16]
var result = fnEvery(ages)
console.log(result)//false
console.log(ages);// (5) [12, 17, 19, 15, 16]
//5.some 检测数组中是否有元素符合指定条件
//类似every的语法,
//当有一个元素满足条件,就会返回true,且剩下的元素就不再检测了
function fnSome(ages) {
return ages.some(item => item < 18)
}
var ages = [12, 17, 19, 15, 16]
var result = fnSome(ages)
console.log(result)//true
console.log(ages);// (5) [12, 17, 19, 15, 16]
//6.fill 使用固定值填充数组(替换原数组元素)
//IE11及以下版本不支持
//ES6
//直接改变原数组,和2copyWithin作比较
//语法:array.fill(value, start, end) //start(可选)开始填充位置,end(可选)结束填充位置(默认是arr.length)
var arr8 = ["a", "b", "c", "d"]
arr8.fill("eee", 1, 2)
console.log(arr8)//["a", "eee", "c", "d"]
//7.filter 返回一个新数组,数组中包含符合筛选条件的所有元素
//不会修改原数组
//不会对空数组进行检测
var arr9 = [12, 17, 19, 15, 16, 20]
var arr10 = arr9.filter(item => item > 18)
console.log(arr10)// [19, 20]
//8.find 返回符合测试条件的第一个元素值,如果没有符合的就返回undefined
//ES6
//IE11及更早版本不支持
//语法:array.find(function(currentValue, index, arr),thisValue)
//不会修改原数组,返回一个元素值,而非数组
var arr11 = [12, 17, 19, 15, 16, 20]
var arr12 = arr11.find(item => {
// console.log(this); //this指向window,使用非箭头函数this也指向window
return item > 18
})
console.log(arr12) // 19
//9.findIndex 返回符合测试条件的第一个元素值的索引,如果没有找到返回-1
//找到之后,后面的元素就不会在调用执行函数
//ES6
//IE11及更早版本不支持
//语法:array.findIndex(function(currentValue, index, arr), thisValue)
//不会修改原数组,返回一个元素值,而非数组
var arr11 = [12, 17, 19, 15, 16, 20]
var arr12 = arr11.findIndex(item => item > 18)
console.log(arr12) //2
//10.forEach 数组中每个元素都执行一次回调函数
// 没有返回值,直接修改原数组
//https://www.runoob.com/jsref/jsref-foreach.html
// 语法:array.forEach(function(currentValue, index, arr), thisValue)
var arr13 = [12, 17, 19, 15, 16, 20];
//计算数组中所有元素的和
var sum = 0;
arr13.forEach(item => {
sum += item;
})
console.log(sum)
//将数组中所有元素都*2
arr13.forEach((item, index, arr) => {
arr[index] = item * 2
})
console.log(arr13)//(6) [24, 34, 38, 30, 32, 40]
// forEach不支持continue和break,
// continue可以通过return或some实现
arr13 = [12, 17, 19, 15, 16, 20];
arr13.forEach(item => {
if (item == 15) {
return; //通过return结束当前循环,执行下一次循环
}
console.log(item)
})
arr13.some(item => {
if (item == 15) {
return;//不能为return false;some会根据return后的条件检测,返回bool值
}
console.log(item)
})
// break可以通过every实现
arr13.every(item => {
console.log(item)//12 17 19 15
return item !== 15
})
//11.map 返回一个新数组,对每个元素调用处理函数,返回处理后的数组
// 不会修改原数组
// 不会对空数组进行检测
// 语法:array.map(function(currentValue,index,arr), thisValue)
// map和forEach的区别就是有没有返回值,map有,forEach没有
var arr14 = [1, 2, 3, 4, 5, 6];
var arr15 = arr14.map(item => item * 2)
console.log(arr14, arr15);//[1, 2, 3, 4, 5, 6] [2, 4, 6, 8, 10, 12]
//12.from 将具有length属性的对象或可迭代对象转化为数组
// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
// 返回一个新数组,浅拷贝
// ES6
// 语法:Array.from(object, mapFunction, thisValue)
var arr16 = Array.from("abcdef")
console.log(arr16)//["a", "b", "c", "d", "e", "f"]
arr16 = Array.from([1, 2, 3], item => item * 10)
console.log(arr16)//[10,20,30]
//13.includes 用来判断数组中是否包含执行的值,包含则返回true,不包含返回false
// 返回bool值
// 语法:arr.includes(searchElement)
// 语法:arr.includes(searchElement, fromIndex) fromIndex默认为0,若为负数,就从fromIndex+arr.length开始
//ES6
var arr17 = ["a", "b", "c", "d", "e", "f"];
var resultIncludes = arr17.includes("a")
console.log(resultIncludes)//true
resultIncludes = arr17.includes("a", 4) // 从下标为3的元素开始查找
console.log(resultIncludes)//false
resultIncludes = arr17.includes("b", -5) // 开始下标若为负数,就从fromIndex+arr.length(-5+6=1)开始
console.log(resultIncludes)//true
//14.indexOf 返回数组中某个指定元素的下标
// 如果没找到就会返回-1
// 语法:array.indexOf(item,start) //start默认为0
// IE8及更早版本不支持
var arr18 = ["a", "b", "c", "d", "e", "a", "f"];
var resultIndexOf = arr18.indexOf("c")
console.log(resultIndexOf) //2
resultIndexOf = arr18.indexOf("y") //不存在,则返回-1
console.log(resultIndexOf) //-1
resultIndexOf = arr18.indexOf("a", 4) //从下标为4开始查找
console.log(resultIndexOf) //5
//15.lastIndexOf 返回一个指定的元素在数组中最后出现的下标,从后往前查找
// 如果没找到就会返回-1
// 语法:array.lastIndexOf(item,start) //start合法取值是 0 到 stringObject.length - 1
// IE8及更早版本不支持
// 与indexOf比较使用
var arr19 = ["a", "b", "c", "d", "e", "a", "f"];
var resultLastIndexOf = arr19.lastIndexOf("a")
console.log(resultLastIndexOf) //5
resultLastIndexOf = arr19.lastIndexOf("a", 3)//从下标为0-3中间进行查找
console.log(resultLastIndexOf) //0
//16.isArray 判断要判断的对象是否为数组,返回bool值
// ES5
// 语法:Array.isArray(obj)
var arr20 = ["a", "b", "c", "d", "e", "a", "f"];
console.log(Array.isArray(arr20))//true
var obj1 = { a: 10 }
console.log(Array.isArray(obj1)) //false
//17.join 把数组中所有元素按照指定的分隔符(分隔符默认为,逗号)分隔成字符串
// 返回一个字符串
var arr21 = ["a", "b", "c", "d", "e", "a", "f"];
var resultJoin = arr21.join()
console.log(resultJoin, arr21) // a,b,c,d,e,a,f
resultJoin = arr21.join(" and ")
console.log(resultJoin) // a and b and c and d and e and a and f
//18.keys 返回数组的可迭代对象,包含原始数组的key键
// ES6
var arr22 = ["a", "b", "c", "d"];
var resultKeys = arr22.keys() // resultKeys是个可迭代对象
console.log(resultKeys.next()) // {value: 0, done: false}
console.log(resultKeys.next()) // {value: 1, done: false}
console.log(resultKeys.next()) // {value: 2, done: false}
console.log(resultKeys.next()) // {value: 3, done: false}
console.log(resultKeys.next()) // {value: undefined, done: true}
//19.map 对数组中每个元素都执行操作函数,返回操作后的新数组
// 不会修改原数组,会返回新数组
// 不会对空数组进行检测
// 语法:array.map(function(currentValue,index,arr), thisValue)
// IE9开始兼容
var arr23 = [1, 2, 3, 4, 5, 6]
var resultMap = arr23.map(item => item * 2)
console.log(resultMap)//[2, 4, 6, 8, 10, 12]
//20.push 用于从末尾添加一个或多个元素,返回操作后原数组新的长度
// 会改变原数组
// 语法:array.push(item1, item2, ..., itemX)
var arr24 = [1, 2, 3, 4, 5, 6]
console.log(arr24.push(8)) //7 现在数组的长度
console.log(arr24) //[1, 2, 3, 4, 5, 6, 8]
console.log(arr24.push(7, 8, 9, 10)) //11 可以添加多个数组
console.log(arr24) //(11) [1, 2, 3, 4, 5, 6, 8, 7, 8, 9, 10]
//21.pop 用于删除数组末尾最后一个元素,并返回删除的元素
// 会改变原数组
var arr25 = [1, 2, 3, 4, 5, 6]
console.log(arr25.pop()) //6
console.log(arr25) //[1,2,3,4,5]
//22.unshift 用于向数组开头添加一个或多个元素,并返回新的数组长度
// 会改变原数组
// 语法array.unshift(item1,item2, ..., itemX)
var arr26 = [1, 2, 3, 4, 5, 6]
console.log(arr26.unshift(8)) //7 现在数组的长度
console.log(arr26) //[8, 1, 2, 3, 4, 5, 6]
//23.shift 删除数组的第一个元素,并返回删除的元素
// 会改变原数组
var arr27 = [1, 2, 3, 4, 5, 6]
console.log(arr27.shift()) //1 返回删除的数组第一个元素
console.log(arr27) //[2,3,4,5,6]
//24.reduce 将数组元素计算为一个值
// 不会改变原数组,会返回计算结果,一个值
// 不会对空数组执行回调函数
// 语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
var arr28 = [1, 2, 3, 4, 5, 6]
var resultReduce = arr28.reduce((total, item) => {
console.log(total, item)
// 1 2
// 3 3
// 6 4
// 10 5
// 15 6
// 21
return total + item
})
console.log(resultReduce);//21
console.log(arr28);//[1,2,3,4,5,6]
//25.reduceRight 和reduce作用一样,不过是从后往前累加
var arr29 = [1, 2, 3, 4, 5, 6]
var resultReduceRight = arr29.reduceRight((total, item) => {
console.log(total, item)
// 6 5
// 11 4
// 15 3
// 18 2
// 20 1
// 21
return total + item
})
console.log(resultReduceRight);//21
console.log(arr29);//[1,2,3,4,5,6]
//26.reverse 颠倒数组中的元素
// 语法:array.reverse()
// 直接修改原数组,并返回修改后的数组
var arr30 = [1, 2, 3, 4, 5, 6]
var resultReverse = arr30.reverse()
console.log(resultReverse) //[6, 5, 4, 3, 2, 1]
console.log(arr30) //[6, 5, 4, 3, 2, 1]
//27.slice 截取数组中的一部分
// 返回截取的新数组,不会修改原数组
// 语法:array.slice(start, end) //包括start,不包括end
var arr30 = [1, 2, 3, 4, 5, 6]
var resultSlice = arr30.slice(0, 3)
console.log(resultSlice, arr30) //(3) [1, 2, 3] (6) [1, 2, 3, 4, 5, 6]
resultSlice = arr30.slice(-3, -1) //-3就是从倒数第三个取到倒数第一个,不包括倒数第一个
console.log(resultSlice, arr30) // (2) [4, 5] (6) [1, 2, 3, 4, 5, 6]
//28.splice 从数组中添加或删除元素
// 会修改原数组
// 返回被删除的元素组成的数组,没删除就返回[]
// 语法:array.splice(index,howmany,item1,.....,itemX)
//index 从何处开始添加或删除,必填
//howmany 可选 删除元素的个数,不填会从index开始删到结尾
//item1,...,itemX 可选 要添加的新元素
var arr31 = [1, 2, 3, 4, 5, 6]
var resultSplice = arr31.splice(2, 0, "7", "8")
console.log(resultSplice, arr31) //[] (8) [1, 2, "7", "8", 3, 4, 5, 6]
resultSplice = arr31.splice(3, 2) //注意,现在的arr31是上次修改后的结果
console.log(resultSplice, arr31) //(2) ["8", 3] (6) [1, 2, "7", 4, 5, 6]
//29.sort 对数组进行排序
// 返回数组的引用,对原数组进行排序,不生成副本
// 会修改原数组
var arr32 = [21, 19, 4, 8, 37, 24]
var resultSort = arr32.sort((a, b) => a - b)//return a-b升序排序;return b-a 降序排序。
console.log(resultSort, arr32, resultSort === arr32)//(6) [4, 8, 19, 21, 24, 37] (6) [4, 8, 19, 21, 24, 37] true
//30.toString 将数组转化为字符串,并用逗号隔开,返回操作结果
// 不会改变原数组
var arr33 = [1, 2, 3, 4, 5, 6]
var resultToString = arr33.toString();
console.log(resultToString, arr33) // 1,2,3,4,5,6 (6) [1, 2, 3, 4, 5, 6]
//31.valueOf 返回数组的原始值
// 不会改变原数组,返回值和原数组一样
var arr34 = [1, 2, 3, 4, 5, 6]
var resultValueOf = arr34.valueOf()
console.log(resultValueOf, arr34, resultValueOf === arr34)//(6) [1, 2, 3, 4, 5, 6] (6) [1, 2, 3, 4, 5, 6] true
</script>
</body>
</html>
总结:会改变原数组的有:copyWithin,fill,forEach(无返回值),push,pop,unshift,shift,reverse,splice,sort
不会改变原数组的有:concat,entries,every,some,filter,find,findIndex,map,from,includes,indexOf,lastIndexOf,join,keys,map,reduce,reduceRight,slice,toString,valueOf
返回boolean值,可用于判断的有:every,some,includes,isArray
转换为字符串:toString,join