多个对象添加到一个空的数组js_JavaScript数组及部分API介绍

本博客介绍的内容如下:

1、创建数组的一般用法;

2、数组对象与普通对象的一些对比;

3、伪数组;

4、数组对象与字符串对象的一些对比;

5、数组window.array的API——forEach、sort;

6、数组window.array的API——join、concat、map、filter、reduce;

7、部分总结

MDN关于数组的介绍链接

Array​developer.mozilla.org
0ecf589bfce388d638b528214685cad5.png

1、创建数组的一般用法

什么是数组——数组是按次序排列的一组值,在JavaScript里面就是用构造函数Array构造出来的对象,就是数组。数组也属于对象。

前面介绍过JavaScript的几种类型及相关的用法

bomber:《JS 历史、数据类型、对象、typeof》​zhuanlan.zhihu.com

(1)只传入一个参数(数字)

var a=Array(3)

打印出来可以看到只有一个length:3,在加上原型(公用属性)

be0d15de965c4df8652899f9d2fd0c2e.png

它有数组单独的原型(公用属性),并且最内层公用属性还是Object。

4684f6cd043938991c47c3c9dad943f9.png

除此之外相应的value也没有

aee58a311492ea7319f668a6bc23169d.png

对应的key也没有

35a1a2059c1a5d85b6e3b8800b0f549e.png

并且他的构造函数是Array

db54c8847f90bf5163ab17d769c2e2bf.png

其他类型的构造函数、原型、__proto__和prototype的区别见博客

bomber:《Global Object、公用属性(原型)、prototype和__proto__》​zhuanlan.zhihu.com

顺便说下,下面的undefined是一个语句的值,声明开头的比如var所返回的值都是undefined。

(2)传入的参数(数字)至少为2个

这时候不仅有长度length,数组的原型(公用属性),还有key和value

ab2f2fd15cf8eee4997a6552a5216c7f.png

这就是数组传入一个参数(数字)和多个参数(数字)的不一致性。

(3)用new创建数组

可以看到加new与不加new的效果是一样的,这与对象(复杂类型)是一致的,因为数组本身也是属于对象。

而前面介绍过基本类型——数字、字符串、布尔,加new与不加new的效果是不一致的。

bomber:《Global Object、公用属性(原型)、prototype和__proto__》​zhuanlan.zhihu.com

单个参数(数字)

507722fa01ad66e57a3c4e58443b72ed.png

多个参数(数字)

e86170ece93adbb30c014c55081bf2ad.png

(4)用中括号[]创建数组

71be418d35614200855d97f4206966c4.png

可以看到,用中括号[]创建的数组,不管传入一个参数(数字)还是多个参数(数字),都可以存在key、value、length还有原型(公用属性)


2、数组对象与普通对象的一些对比

(1)数组对象与普通对象的原型链的对比

一个数组对象

var a=[1,2,3]

列一个长得很像上面数组的普通对象

var b={
    
0:1,
1:2,
2:3,
length:3
}

通过打出来可以看到他们长得特别像

61f48ce46878fbb0aa005354c7049a79.png

虽然本身的内容很像,但是他们各自的__proto__不同,对应的他们各自的构造函数也不同。

09d83a4af1e1ca5357d1475bc7201435.png

数组对象是由构造函数Array构造的,普通对象是由构造函数Object构造的。Array.prototype有Object.prototype没有的属性,比如pop,push,shift等

a756307edc998da6cee4ee8330565006.png

之前在算法和数据结构中有说到队列和栈

bomber:算法和数据结构​zhuanlan.zhihu.com

而队列和栈才可以使用pop、push、shift,所以队列和栈是用数组来实现的,数组可以是队列或者栈,但是普通对象不能实现。

但是数组和对象都可以是哈希表。

(2)数组对象与普通对象属性访问器(点号或中括号)的对比

同样是(1)里面的数组对象和普通对象。

5994ffda534af02610fd46b0e498e577.png

经过测试,可以看到数组对象和普通对象都是可以进行属性访问器的操作,并赋值,唯一不同的是数组对象如果使用了数字key,那么他的length就会改变为最大的数字key加一。这与前面算法与数据结构里面哈希一节说到的length完全一致。

如果数字key与原来的数字key之间有间隔,那么会多出几个empty

bomber:算法和数据结构​zhuanlan.zhihu.com

(3)数组对象与普通对象遍历的对比

数组对象代码:

var a=[1,2,3]
a.xxx='xxx'
a.yyy='yyy'
a[10]=1

普通对象代码:

var b={
    
0:1,
1:2,
2:3,
length:3
}
b.xxx='xxx'
b.yyy='yyy'
b[10]=1

(3-1)用for循环遍历

(3-1-1)遍历数组对象a

for(let i=0;i<a.length;i++){
    console.log(a[i])
}

可以看到只会遍历到数字key对应的value。中间空出来的几个会显示undefined,而不是数字的xxx和yyy作为key的时候不会打出任何信息。

fa5e4d3fb3a0d9d9f5c05c4679e8a27e.png

(3-1-2)遍历普通对象b

可以看到只会遍历到数字key对应的value。

6e55960ad95a523f547c08034f8048b1.png

因为普通对象里面的length是我们手动写进去,为了显示和数字一样而已,这里的length还是3,所以遍历不到数字10。

把判定条件修改为i<11后

f171871dbe1614b6823f697766208417.png

显示的效果跟数组是一样的。


说明数组默认有对应的key,key从0开始计数。数组的某个数字key就是对应的索引值。因为这里for循环是用的数字来获取key值,所以相应的非数字key是无法获取得到的。

如果想遍历对象里面的所有key,该方法(用for循环遍历)仅仅适用于数字作为key的对象,因为本身i设置的就是从0开始做加1计算来判定,而数组对象刚好就是默认所有的key都是数字做为key。当然用户可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值