类数组对象啊,被人问到它跟真正的数组对象有什么差别啊?说不上来就老埋汰了,只知道函数的arguments对象是个类数组对象,也有length属性,其他呢?干货奉上:

首先先说说数组吧:

1,当有新的元素添加到列表中时,会自动更新length属性。

2,设置length为一个较小值将截断数组。

3,从Array.prototype中继承一些有用的方法。

4,其类属性为“Array”。

这些类数组对象可以进行遍历,但是不能使用数组方法,也不用期望length属性有什么特殊的行为,看看类数组对象是怎么生成的吧?

 var a = {};
var i = 0;
while(i<10){
a[i] = i*i;
i++;
}
a.length = i; var total = 0;
for(var j = 0;j<a.length;j++){
total += a[j];
}

这里其实生成了一个对象a,里面有key,value的键值对,key值是从0到9,还有一个length属性,这个length属性是定义好的,除非手动更新,否则不变的。

之前函数的arguments对象就是一个类数组对象,在客户端javascript中,一些DOM的方法:如document.getElementsByTagName()的结果也是返回类数组对象。如何检测类数组对象呢?

首先先确定是个对象,不是null或者undefined,它的length是有限非负整数,typeof o === 'object';

好像数组也符合这个,因为类数组对象没有继承Array.prototype,应该再加上Object.prototype.toString.call(o) !== 'Array',就是个类数组对象了。

划重点!!!来来来!!!

虽然类数组对象没有继承Array.prototype,没有什么join,slice,pop,push等等方法,但是忘记call和apply神器的用法了么?代码如下:

var a = {"0":"a","1":"b","2":"c","3":"d",length:4};
Array.prototype.join.call(a,'+'); //"a+b+c"
Array.prototype.slice.call(a,0) //['a','b','c','d'],真正数组的副本啊

这里出个题了,怎么将一个类数组对象转化为一个真正的数组对象???

答案就是:a = Array.prototype.slice.call(a,0),再用Array.isArray(a)检测类型,true,哈哈哈哈

Part two:作为数组的字符串

字符串的行为类似于只读数组,除了用charAt()访问单个字符以外,还可以用方括号[]:

var s = 'test';
undefined
s.charAt(0) === s[0]
true

方括号代替charAt()更加简洁,可读并且高效。

也可以用数组的方法应用在字符串上面:

Array.prototype.join.call(s,",")

"t,e,s,t"
注意:字符串是不可变值,当做数组看待时候,只读。所以,push,sort,reverse,splice等在字符串上面是无效的。而且尝试用会报错。

JavaScript的类数组的更多相关文章

  1. JavaScript arguments类数组

    1. 什么是类数组 arguments 是一个类数组对象.代表传给一个function的参数列表.  我们来传一个实例. function printArgs() { console.log(argu ...

  2. javascript:类数组 -- 对象

    在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 类数组:本质是一个对象,只是这个 对象  的属性有点特殊,模拟出数组的一些特性. 一般来说,如果我们有一个 ...

  3. javascript中关于数组的一些鄙视题

    一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...

  4. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  5. Javascript 类数组(Array-like)对象

    Javascript中的类数组对象(Array-like object)指的是一些看起来像数组但又不是数组的对象.Javascript中的arguments变量.document.getElement ...

  6. JavaScript类数组对象参考

    JavaScript和DOM中有很多类数组对象,它们有以下特点 1.有length属性 2.可以使用[]通过下标访问 3.部分类数组对象使用[]访问成员时不只可以使用下标,还可以使用id或name 4 ...

  7. 浅谈JavaScript和DOM中的类数组对象

    JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined.Null.Boolean.Number.String)和复杂数据类型(1种:Object).Obj ...

  8. javascript 类数组对象

    原文:https://segmentfault.com/a/1190000000415572 定义: 拥有length属性,其他属性(索引)为非负整数(对象中的所有会被当做字符串来处理,这里你可以当做 ...

  9. JavaScript数组&类数组转换

    一.数组 在JavaScript中数组可以容纳任何类型的值,可以是数字.字符串.对象.甚至其他数组(多为数组) var a = [1,'2',[3]]; a.length;//3 a[0];//1 a ...

随机推荐

  1. 如何处理xml文件!看看这里

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...

  2. php的header方法

    http://www.cnblogs.com/fengzheng126/archive/2012/04/21/2461475.html

  3. 3dmax2012卸载/安装失败/如何彻底卸载清除干净3dmax2012注册表和文件的方法

    3dmax2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dmax2012失败提示3dmax2012安装未完成,某些产品无法安装,也有时候想重新安装3 ...

  4. Pycharm 2019 破解激活方法

    转载:https://blog.csdn.net/guofang110/article/details/87793264 使用破解补丁方法虽然麻烦,但是可用激活到2099年,基本上是永久激活了,毕竟在 ...

  5. Oracle之函数中使用游标

    create or replace function getcustprodinstaddr(in_CustId in number,in_area_code in number) return va ...

  6. Django学习之路05

    Django模板层 模板层语法(两类) 变量相关:{{      }} 逻辑相关:{%  %} 给模板传值的方法 #方法1 #通过字典传值,指名道姓,例如下 return render(request ...

  7. django models 中choices之用法举例

    CHOICES常用做单选属性,下面举例在django models中人物性别的用法: 我们先定义一个模型,名字为Students ,这个Students 包含了名字和性别两个字段,代码如下: from ...

  8. 中文字体压缩器-解决css引入的字体太大的问题

    字蛛是一个中文字体压缩器 官方网站:http://font-spider.org/index.html 用于解决页面引入的css字体过大的问题 使用方法: npm i -g font-spider 在 ...

  9. GCD学习 —— 三

    ​ 学习学习dispatch_block,在向队列中添加任务时,可以直接在对应的函数中添加 block.但是如果想对任务进行操作,比如监听任务.取消任务,就需要获取对应的 block. 1 创建Blo ...

  10. Jetson TX2镜像刷板法

    使用Nvidia官方自带的脚本,备份镜像.恢复镜像,快速在新板子中部署DL环境 在之前的一篇博客中,详细介绍了使用JetPack刷系统以及使用离线包部署DL环境(cuda.cudnn.opencv.c ...