js其实没有真正的数组,它只是用对象模拟的数组
-
js的数组不是典型的数组
1.典型的数组
- 元素的数据类型相同
- 使用连续的内存存储
- 通过数字下标获取元素
2.但JS的数组不是上面那样
- 元素的数据类型可以不同
- 内存不一定是连续的(对象是随机存储的)
- 不能通过数字下标,而是通过字符串下标
- 这意味着数组可以有任何key
- 比如
- let arr = [1, 2, 3]
- arr['xxx'] = 1
- 元素的数据类型可以不同
下标为字符串0的,它的值为1
下标为字符串1的,它的值是个对象(实际上只是存了一个对象的地址#202,然后新开辟一块空间,存对象)
- 内存不一定是连续的
存储的顺序不一定是'0' '1' '2'也有可能是'2' '1' '0'或者'1' '2' '0'或者'1''0' '2'
不是一个一个挨着存的
- 一定要注意是通过字符串下标,而不能通过数字下标
-
创建一个数组
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用什么分割字符串
let arr = '123'.split('')
Array.from('123') //将不是数组的东西变成数组
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)
4.合并两个数组,得到一个新数组
arr1.concat(arr2)
5.截取一个数组的一部分
arr1.slice(1) //从第2个元素开始
arr.slice(0) //全部截取(用来复制数组)
注意:JS只提供浅拷贝
-
延伸出的问题
1.为什么数组只支持字符串,但我用数字也可以取到?
因为JS有个神奇的功能,如果JS发现你输入的不是一个字符串,他就会帮你变成一个字符串
如:当你传数字1的时候,JS会帮你把它变成字符串'1'
2.如果下标0123,和我的length不一致呢?
以length是几为准
例如:
我下标是0123,但是length写错了写成2,最终以谁为准呢?以下标还是length?
那么得到的数组长度是2