1 数组
1.1 数组对象
-
一种特殊的对象;
-
JS其实没有真正的数组,只是用对象模拟数组,数组的下标不是数字,而是字符串;
-
JS的数组一出生就带了 length ;
1.2 JS数组与典型数组的区别
2 创建数组
2.1 新建数组
let arr = [1,2,3]
let arr = new Array(1,2,3)
let arr = new Array(3)
2.2 字符串转化为数组
let arr = '1,2,3'.split(',')
let arr = '123'.split('')
Array.from('123')
-
Array.from()可以通过以下方式来创建数组对象:- 伪数组对象(拥有一个
length属性和若干索引属性的任意对象) - 可迭代对象(可以获取对象中的元素,如 Map和 Set 等)
- 属性名代表了数组的索引号,如果没有这个索引号,转出来的数组中对应的元素就为undefined。
- 伪数组对象(拥有一个
- 如果对象不带length属性,那么转出来就是空数组:
- 对象的属性名不能转换成索引号时。
- length与索引号不对应时
2.3 伪数组
- 定义:没有数组共用属性的数组就是伪数组
-伪数组的原型链中没有数组的原型;
2.4 concat
-
合并两个数组,得到新数组;
-
arr1.concat(arr2);
2.5 slice
-
arr.slice(1):从第二个元素开始;
-
arr1.slice(0):全部截取,可复制数组;
-
原生 JS 只提供浅拷贝;
-
slice返回选取的元素,不影响原数组;
3 数组的增删改查
3.1 删除元素
- delete
let arr = ['a','b','c'] delete arr['0']
- 不改变length,生成稀疏数组,稀疏数组是指 索引不连续,数组长度大于元素个数的数组,通俗地说就是 有空隙的数组,稀疏数组没有好处,只有bug,尽量不要用;
- 直接改length,不要随便改 length;
3.2 数组方法删除元素(推荐)
- shift 删除头部元素
arr.shift():arr被修改,并返回被删元素;
- pop 删除尾部元素
arr.pop()arr被修改,并返回被删元素;
- splice 删除中间的元素
- arr被修改,并返回被删元素;
3.3 查看数组元素
- 查看所有属性名,数组中不要用for in(访问对象),也不要用Object.keys(),会出现不想要的东西;
let arr = [1,2,3,4,5]
arr.x = 'xxx'
Object.keys(arr)
Object.values(arr)
for(let key in arr){
console.log(`${key}:${arr[key]}`)
}
- for、forEach查看数字(字符串)属性名和值(推荐)
let arr =[1,3,5,7,8]
for (let i=0; i< arr.length; i++){
console.log(`${i}:${arr[i]}`)
}
arr.forEach(function(item,index){
console.log(`${index}:${item}`)
})
- 写forEach,forEach可以传三个参数,一般不写第三个参数
3.5 查看单个属性
-
索引查看:
arr[index]; -
索引越界:读取任何不存在的下标,都会得到undefined,而undefined不属于对象,所以没有toString;
arr[arr.length]===undefined
arr[-1]===undefined
3.6 查看单个属性
-
indexOf:查看某个元素是否在数组里
arr.indexOf(item):存在返回索引,否则返回-1; -
arr.find:条件查找,返回第一个符合条件的值;
arr.find(item=>item%2===0):找第一个偶数 -
findIndex:条件查找元素的索引,返回第一个符合条件的索引值
arr.findIndex(item=>item%2===0):找第一个偶数的索引值
3.7 增加数组中的元素
- push:尾部加元素,修改arr,返回新数组的长度
arr.push(item1,item2,...)
-
unshift:头部加元素,修改arr,返回新数组的长度
arr.unshift(item1,item2,...) -
splice:在中间加元素,修改arr,返回删掉的元素
arr.splice(index,0,'x') //在index处插入'x'
arr.splice(index,0,'x','y')
3.8 修改数组中的元素
-
reverse:反转顺序,修改原数组;
arr.reverse() -
sort:自定义顺序
- 从小到大排,还可以写成:
arr.sort((a,b)=>a.score-b.score):因为a.score大于b.score的话,就会返回正数;
4 数组变换
- map、filter、reduce都不会修改原数组
- 数组变成对象
let arr=[{名称:'动物',id:1,parent:null},{名称:'狗',id:2,parent:1},{名称:'猫',id:3,parent:1}]
arr.reduce((result,item)=>{
if(item.parent===null){
result.id=item.id
result.名称=item.名称
}else{
result.children.push(item)
delete item.parent
item.children=null
}
return result
},{id:null,children:[]})