获取Object对象的length

摘要:
所有JS程序猿(甚至不止JS)都知道,数组(Array)是有length的,通过length属性,可以很方便的获取数组的长度。可以说,只要使用到了数组,就必会使用到其length属性。  而Object对象是没有length属性或方法的,它确实没有存在的必要,因为人们只会在乎该对象能提供什么样的方法,而没有必要知道它到底有多少方法。的确,这确实不是一个普遍性的需求,因此ECMAScript中也不会为自己增加额外的负担。  我之前一直没有考虑过这个问题,我们通过CGI获取数据,对于一条一条的数据,

所有JS程序猿(甚至不止JS)都知道,数组(Array)是有length的,通过length属性,可以很方便的获取数组的长度。可以说,只要使用到了数组,就必会使用到其length属性。

  而Object对象是没有length属性或方法的,它确实没有存在的必要,因为人们只会在乎该对象能提供什么样的方法,而没有必要知道它到底有多少方法。的确,这确实不是一个普遍性的需求,

因此ECMAScript中也不会为自己增加额外的负担。

  我之前一直没有考虑过这个问题,我们通过CGI获取数据,对于一条一条的数据,后台将其做成数组并以json返回。如下所示:

1 try{callback({2     data:[{a:1},{a:2}]3     });4 }catch(e){}

  这是非常合理的,因为我在前端可以用length得到数据的长度,并逐条将其插入表格,或者是通过其他的方式表现出来。但是你永远也不能用一成不变的思维方式来解决所有问题。

  某天写后台接口的同事决定换一种数据格式,改用object来表示数据,并为每个数据添加一个索引,如下所示:

1 try{callback({2     data:{1:{a:1},2:{a:2}}3     });4 }catch(e){}

  面对这样的数据,我就犯愁了,因为object不能获取对象长度。当然我可以叫后台同事改一下接口返回的格式,但是既然他可以写出以这样格式返回的代码,那其他的后台同事也同样

可以写出。为了不影响到更多的人,就需要我在前端来做处理了。其实要获取对象的长度也不难,用for in 语句就能实现,如下代码所示:

复制代码
1 var a = {a:1,b:2,c:3,d:4};2 function length(o) {3     var count = 0;4     for(var i in o){5         count ++;6     }7     return count;8 };9 alert(length(a));    //5
复制代码

  至于为什么是5而不是4那是因为每个对象都有一个内部属性(__proto__指向原型)。

  为了更方便的使用这个方法,可以把它写到Object原型里面去,如下代码所示:

复制代码
1 var a = {a:1,b:2,c:3,d:4};2 Object.prototype.length = function() {3     var count = 0;4     for(var i in this){5         count ++;6     }7     return count;8 };9 alert(a.length());    //5
复制代码

  这样用起来会更直观,跟接近Array的使用习惯。


免责声明:文章转载自《获取Object对象的length》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NAPI简介qad系统库存管理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

cglib动态代理

通过前面介绍的文章可知,JDK的动态代理用起来非常简单,但动态代理中使用动态代理的对象必须实现一个或多个接口。如果一个类没有实现任何接口,只是一个纯粹的类,如果要实现对它的代理,那该该怎么办?为例解决这个问题,因此就引入了cglib动态代理。 为了保证关于代理的这几篇文章连续性,本文先占个坑,只简单介绍如何使用cglib,以后会修改并深入研究下原理。 使...

【ECMAScript5】ES5基础

一、语法 区分大小写。 变量是弱类型的,可以初始化为任意值,也可以随时改变变量所存数据的类型。 每行结尾的分号可有可无,但是建议加上。 注释 单行注释以双斜杠开头(//) 多行注释以单斜杠和星号开头(/*),以星号和单斜杠结尾(*/) 代码块:用{ } 包起来的 二、变量 使用 var (variable的缩写)运算符声明变量。 可以用一个var...

Python的魔法函数

概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python #-*- coding: utf-8 -*- #Author: rex.cheny #E-mail: rex.cheny@outlook.com #类名后面写(object...

resize监听div的size变化

具体实现分两类, ie9-10 默认支持div的resize事件,可以直接通过div.attachEvent('onresize', handler);的方式实现 其它浏览器 通过在div中添加一个内置object元素实现监听。设置object元素的style使其填充满div,这样当div的size发生变化时,object的size也会发生变化。然后监听o...

Springcloud +redis集群

springcloud  中 springboot版本是2.X.X以上的,版本不同,集群对应的客户端api方法,连接池不一样.   具体操作可以看git上源码. redis集群的配置比较简单. 添加jar: <dependency> <groupId>org.springframework.boot</group...

堆栈信息分析

一、堆栈信息解读 2013-01-13 11:02:31 Full thread dump Java HotSpot(TM) Client VM (23.1-b03 mixed mode, sharing): "[ThreadPool Manager] - Idle Thread" daemon prio=6 tid=0x069a3400 nid=0x84...