13. 数组对象

229 阅读3分钟

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