JS数组1

88 阅读2分钟

js其实没有真正的数组,它只是用对象模拟的数组

  • js的数组不是典型的数组

1.典型的数组

  1. 元素的数据类型相同
  2. 使用连续的内存存储
  3. 通过数字下标获取元素

2.但JS的数组不是上面那样

  1. 元素的数据类型可以不同
  2. 内存不一定是连续的(对象是随机存储的)
  3. 不能通过数字下标,而是通过字符串下标
  4. 这意味着数组可以有任何key
  • 比如
  • let arr = [1, 2, 3]
  • arr['xxx'] = 1

image.png

  1. 元素的数据类型可以不同

下标为字符串0的,它的值为1
下标为字符串1的,它的值是个对象(实际上只是存了一个对象的地址#202,然后新开辟一块空间,存对象)

  1. 内存不一定是连续的

存储的顺序不一定是'0' '1' '2'也有可能是'2' '1' '0'或者'1' '2' '0'或者'1''0' '2'
不是一个一个挨着存的

  1. 一定要注意是通过字符串下标,而不能通过数字下标

image.png

  • 创建一个数组

1. 新建

let arr = [1, 2, 3]
let arr = new Array(1, 2, 3)
let arr = new Array(3) //3代表的是长度为3

2. 转化的方式创建数组

let arr = '1,2,3'.split(',')   //split用什么分割字符串

image.png

let arr = '123'.split('')

image.png

Array.from('123') //将不是数组的东西变成数组

image.png

3. 伪数组

    <div>1</div>
    <div>2</div>
    <div>3</div>
let divList = document.querySelectorAll('div') //querySelectorAll只是创建了一个对象而已,没有给你构建数组的原型

伪数组的原型链中并没有数组的原型(伪数组:也就是没有数组的那些共有属性如push,pop,shift...)

可以通过Ararry.from将divList转成数组

let divArray = Array.from(divList)
console.log(divArray)

image.png

4.合并两个数组,得到一个新数组

arr1.concat(arr2)

5.截取一个数组的一部分

arr1.slice(1) //从第2个元素开始
arr.slice(0)  //全部截取(用来复制数组)

image.png

注意:JS只提供浅拷贝

  • 延伸出的问题

1.为什么数组只支持字符串,但我用数字也可以取到?

因为JS有个神奇的功能,如果JS发现你输入的不是一个字符串,他就会帮你变成一个字符串

image.png
如:当你传数字1的时候,JS会帮你把它变成字符串'1'

2.如果下标0123,和我的length不一致呢?

以length是几为准
例如:
我下标是0123,但是length写错了写成2,最终以谁为准呢?以下标还是length?

image.png

那么得到的数组长度是2