JS对象可以分很多类,其中包括数组和函数
一、数组对象
数组是一种特殊的对象
JS其实没有真正的数组,只是用对象模拟数组
在其他语言中,数组是一个连续的空间分配,但在JS中不是
1.JS数组不是典型数组
- 典型的数组
1.元素的数据类型相同(都是数字)
2.使用连续的内存存储
3.通过数字下标获取元素
- JS的数组不是这样
1.元素的数据类型可以不同(可以是数字或者对象,内存可以不连续)
2.内存不一定连续(对象是随机存储的)
3.不能通过数字下标来获取,只能通过字符串下标(下标是key
,只能是字符串),因此JS数组不支持数字下标
4.意味着数组可以有任意 key
5.如:let arr = [1,2,3]
arr['xxx']=1
==总结:JS的数组实际上是对象,使用key
和value
来模拟的数组=
2.创建一个数组
-
新建
let arr = [1,2,3]
let arr = new Array[1,2,3]
:和第一个完全等价,这个便于理解,第一个是简写
let arr = new Array(3)
:其中3为数组的长度 -
转化
1.let arr = '1,2,3'.split(',')
2.let arr = '123'.split('')
以上两种是简写
3.Array.from(123)
:从什么地方得到一个数组,给它传一个字符串,它就会把不是数组的东西尝试变成数组
但Array.from()
不是能把所有东西都可以变成数组:1.数字和布尔都不行;
要求:1.对象有0、1、2、3这样的下标;2.有一个length
属性
如果:length的长度和前面的数量对不上,以长度为准
如:Array.from({0:'a',1:'b',2:'c',3:'d',length:3})
4.为什么不是真正的数组,却可以通过数字下标得到?如:arr[1]
答:因为JS会自动先变成字符串1,再放进去 -
伪数组(原型链有关):没有数组共有属性的[数组],就是伪数组
1.let divList = document.querySelector('div')
:创造一个数组,里面没有push、pop这些数组共有属性,因此这是一个伪数组
结局方法:添加一个Array.from,可以把不是数组的东西变成数组
2.伪数组的原型链中没有数组的原型,因为它的原型直接指向了对象的原型
array中第一层是012345,第二层的__proto__里面是jion、push、map属性,第三层__proto__才是普通对象的共有属性,所以里面是有一层原型的,这一层原型才是数组的精髓
而伪数组看起来像数组,但点开原型链,点开第一层的__proto__直接就是共有属性,没有push这些
什么是伪数组?
答:如果一个数组中push、pop这些所有数组共有的属性,那么它就是伪数组
-
合并两个数组,得到新数组
arr1.concat(arr2)
:concat会得到一个新数组,不会改变原来的数组
-
截取一个数组的一部分(不影响原数组)
arr5.slice(1)
:从第二个元素开始(计数是:0,1,2)
arr5.slice(0)
:全部截取,常用于复制一个数组
let arr6 = arr5.slice(0)
:复制数组5为数组6
注意:JS只提供浅拷贝
增删改查
数组中的元素
1.删元素(不推荐使用的两种)
- 跟对象一样
delete arr['0']
arr
为[empty, "b", "c"]
长度没有发生改变
- 稀疏数组:把数组中的元素全删了,只有长度,没有下标(没有任何好处,只有bug的数组)
- 直接改
length
可以删元素:不要随便改length
2.删元素(推荐使用的方法)
一个对象提供的函数就叫做API(这里包括 shift、pop、splice)
- 删除头部的元素
shift
就是把整体向上抬,第一个元素就被挤出去,长度也会随着改变
arr.shift()
:arr 被修改,并返回被删元素
- 删除尾部的元素
arr.pop()
:arr 被修改,并返回被删元素
- 删除中间的元素
arr.splice(index,3)
:删除下标为从index
的3个元素(包含index
)
arr.splice(index,1,'x')
:删除一个元素,并在元素位置添加’x’
arr.splice(index,1,'x','y')
:删除一个元素,并在元素位置添加’x’,‘y’(数量可任意)