Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 390|回复: 0

解决js array的key不为数字时获取长度的问题

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-6-4 16:17:34 | 显示全部楼层 |阅读模式

    最近写js时碰到了当数组key不为数字时,获取数组的长度为0 的情况。

    1、问题场景

    var arr = new Array();
    arr[‘s1‘] = 1001;
    console.log(arr.length);

    通过chrome查看:

    2、原因分析

    js Array只支持数字索引,若指定的key为非数字索引,那么length为0.

    另外,若key为数字索引,length的长度是根据key值得出的,比如一个数组a中key最大值为1000,value为1000,那么a的长度就是1001.只有a[1000] = 1000.从a[0]到a[999]的值为undefined

    可以来验证一下:

        var arr = new Array();
        arr[1000] = 1001;
        console.log(arr.length);

    3、解决长度问题

    出现问题的原因已经知道了,有的时候我们需要设置的key不是数字索引,而是非数字索引,那么如何获取长度呢。我们可以把Array看成是特殊的Object类型。有两种方式可以得到Object类型的长度:

    第一种方法:通过 Object.keys(obj).length 获取。

    可以验证下:

        var obj = new Object();
        obj[1001] = 1001;
        obj[1002] = 1002;
        console.log(obj.length);
        console.log(Object.keys(obj).length);

    该方法获取长度是会获取到原型的属性的,如果一个对象继承了另一个对象,或者在原型中设置了属性,要想获取对象的本身的属性时,这个方法是不靠谱的。

    因此,第二个方法就是过滤到原型的属性:

    调用:var length = getPropertyCount(obj);

    由于任何一个Object对象都有方法 hasOwnProperty,当属性为原型定义的属性,hasOwnProperty返回true。

     function getPropertyCount(o){  
           var n, count = 0;  
           for(n in o){  
              if(o.hasOwnProperty(n)){  
                 count++;  
              }  
           }  
           return count;  
        } 

    问题到这里应该可以解决了,现在想要获取一个数组的实际指定的长度,一般来说,我们不会为Array的原型添加额外的属性,所以,我们可以通过采用上面的第一种方式解决。

    可以验证下:

    题外话:

    判断一个属性是否是共享属性,可以通过hasOwnProperty 及in 联合判断。

    hasOwnProperty:当对象存在属性且属性不是共享的,返回true

    in:当对象中存在属性,返回true. 

     

    因此,如判断person中是否存在私有属性属性a,person.hasOwnPropety(a) && a in person 需返回true

     

    判断person中是否存在共享属性属性a, !person.hasOwnProperty(a) && a in person 需返回true
     
     
     
     
     
     
     
    原文:http://www.cnblogs.com/wmmang-blog/p/4067143.html
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 10:39 , Processed in 0.056429 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表