如何将一个对象转换成数组?_javascript中什么是伪数组?如何转换成真数组

点击上方“蓝字”,发现更多精彩。

大约在200万年前,人类祖先炎帝联合黄帝同神魔蚩尤展开激烈的战斗,那一战打的昏天暗地,日月无光,足足百年,人间生灵涂炭。。。千年之后,人类开始从再次从蛮荒开始走向文明。。。扯犊子了,实际上在两年前,一次面试前端时候遇到面试官问起我什么是伪数组,我蒙蔽,纳尼?只知道数组,怎么还有假数据,蒙了,后来回去一番侦查,才发现原来就是这么个玩意儿,时至今日我也没没搞明白那人问我这个概念的具体意义,因为在我看来,这个东西本身就没太大意义,起码我至今没真正见过有人能拿它做啥?

什么是伪数组?

  • 不要像年轻的我样,被这个概念给吓着了,其实就是个噱头,所谓的伪数组就是个对象,但它具有这么几个特点:

  • 伪数组是一个对象

  • 这个对象必须要有length属性

  • 它终究是个假数组,它没有数组的splice,concat,pop等方法

  • 如果这个对象的length不为0,那么必须要有按照下标存储的数据

var a= {    'length': 3,    "0": "first",    "1": "second",    "2": "third"}console.log(Object.prototype.toString.call(a))console.log(a.length)console.log(a[0])//结果:[object Object]3first

嗦嘎,看到没,这玩意儿唯一有意思地方就是有个长度属性,并且你不管访问第几位下标时候取值,都把length属性给忽略,就好比上面我console.log(a[0]),按道理我们应该拿到的是3,但实际打印出来的是first。那么如果我这么写你再来看一个逗比景象

var fakeArray = {    length: 10,    "0": "first",    "1": "second",    "2": "third"};console.log(fakeArray.length)//结果:10

嗯哼?正常对象我们取长度是取不了的,结果本身是undefined,但伪数组中有length属性,所以这里我们取到了所谓的长度10。

伪数组转化为真数组

可以通过call或者apply的方法,将伪数组转化为真数组

var fakeArray = {    length: 10,    "0": "first",    "1": "second",    "2": "third"};Array.prototype.slice.call(fakeArray)// 此时已经改变了 this 指向,使得fakeArray拥有了真数组的原型方法,如下图:

23bc39aea7b3d3922b0be7d499a40107.png

伪数组在哪里?

其实伪数组在实际项目中随处可见,如下图:

<html lang="en"><head>    <meta charset="UTF-8">    <title>Documenttitle>head><body>    <ul id = 'ul'>        <li>li>        <li>li>        <li>li>        <li>li>    ul>body><script>    var arr = document.getElementById('ul')    console.dir(arr.children)script>html>

57264fcb4dbcf06cbad577b8b92ba9b0.png

总结

  • 1、伪数组没有数组 Array.prototype 的属性值,类型是 Object ,而数组类型是 Array

  • 2、数组是基于索引的实现, length 会自动更新,而对象是键值对

  • 3、使用对象可以创建伪数组,伪数组可以利用call或者apply很方便的转化为真数组

  • 4、反着我就发现这么几个特性玩意儿,具体能做个啥,大家项目中自己去尝试,下次有人再拿这玩意儿面试,我得好好请教下对方,这玩意儿到底能干嘛?装13显得自己懂的概念多么?

ca6a7d2756889f9e906a9b716483571d.gifEND 4fe1016c79b9f92b93367d6594fdb352.gif 04addf41e91e1f5409fd7571e0524b70.png扫码关注我们 1f3c3b8881ecc9ccabcb5f89a55bd404.png微信号:gh_dcd05cdf3c3e扫码关注我们,获取最新资讯。分享,点赞,在看,都在这儿,点我不香吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值