13.1 c语言数组和js数组的区别
c语言数组:
- 元素的数据类型相同
- 连续内存存储
- 通过数字下标存取元素
- 内存图:
js数组: 完全是由对象模拟出来的数组
- 元素数据类型可以不同
- 不一定是连续的, 如果值是一个对象, 内存里面会存地址
- 不能通过数字下标, 而是字符串下标
- 内存图:
13.2 新建数组
let arr = [1, 2, 3]
let arr = new Array(1, 2, 3) // [1, 2, 3]
var arr = new Array(3) // [empty × 3] 这里容易错
如何通过分割字符串生成数组?
var arr = '1,2,3'.split(',') //["1", "2", "3"]
var arr = '123'.split('') //["1", "2", "3"]
//2. 用Array.from
Array.from('123') //["1", "2", "3"]
Array.from(123) //[]
Array.from(true) //[]
Array.from({name:'frame'}) //[]
Array.from({0:'a',1:'b'}) //[]
Array.from({0:'a',1:'b', length:2}) //["a", "b"] 这样生成的数组是伪数组
Array.from({0:'a',1:'b', length:1}) //["a"]
什么是伪数组?
伪数组中没有数组的原型, 也就是pop() push() 等api
生成伪数组的方法:
- 对象添加length,强行生成.:
Array.from({0:'a',1:'b', length:2}) //["a", "b"] 这样生成的数组是伪数组 var divList = document.querySelectorAll('div')得到的也是伪数组
如何连接两个数组
arr.concat(arr2) 返回新数组, 不改变原来的
slice的使用
-
切片:
var arr = [1, 2, 3, 4,5,6,7,8,9] //输入起始坐标 arr.slice(2) //[3, 4, 5, 6, 7, 8, 9] arr //[1, 2, 3, 4, 5, 6, 7, 8, 9] //输入0 就是浅拷贝 arr.slice(0) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
13.3 删除数组中的元素
智障delete: 删除元素但是会留空
var arr = ['a', 'b', 'c']
delete arr[0] //true
arr //[empty, "b", "c"] length不变, delete就是一个智障
这种数组叫做稀疏数组, 只有产生bug的作用
不要随便改length
正确删除的姿势:
-
删除第一个元素:
.shift() -
删除最后一个:
.pop( )
- 替换中间的元素:
.splice(begin, length, item)
###13.4 遍历的数组
-
智障的in: 会打印length之外的元素
-
用for遍历比较好
- forEach 遍历数组
for 除了 break continue, 其他和forEach一样
for是关键字, 块级作用域, forEach是函数作用域
遍历数组遇见的错误
越界undefined
###13.5 查找元素
indexOf(): 按照索引找元素.find((x)=> (x%5) === 0)): 按照条件找元素, : 满足x整除5的元素, 返回的是元素.findIndex((x)=> (x%5) === 0)): 按照条件找元素, : 满足x整除5的元素, 返回的是索引
13.6 其他常用api
-
直接arr[100] = 100 , 相当于直接改length , 变成稀疏数组
-
添加元素: 头部添加:
.unshift. 尾部push中间.splice -
翻转数组:改变原来数组
通过数组翻转字符串:
-
数组排序:
.sort-
具体写法:
-
改变原来数组
-
快速写法:
-
###13.7 数组变换
- reduce把所有东西吃下去, 消化后成为一个东西, 例如数组求和:0代表初始值.
- reduce可以代替map, filter:
- 猫狗, 变为动物的children