类数组对象如何作为数组使用 ---(call方法)

2018-8-3 最近很常使用类数组对象,写一下自己的所得


先简单列一下自己遇到的类数组对象

1. Arguments

  • 个人接触的第一个类数组,就是arguments元素
    以前写的arguments的简单介绍,点这儿

看看arguments在控制台的输出:
JavaScript :

function gaara(val1,val2,val3,val4,val5){
  console.log(arguments);
}

gaara(1,2,3,4,5);

输出 :


2. HTML Collection

  • HTML Collection也是比较常见的一种特殊类数组对象,在使用js获取页面元素时,如果是通过类名或者标签名,就会得到一个HTML Collection

  • 我们可以很轻易的通过使用的方法名来知道我们将得到的是元素,还是元素集
    getElementById( ) --element 获取元素
    getElementsByClassName( ) --elements获取元素集
    getElementsByTagName( ) --elements获取元素集

看看HTML Collection在控制台的输出:
JavaScript :

var col = document.getElementsByTagName('div');

console.log(col);

HTML :

<div>1</div>  <div>2</div>
<div>3</div>  <div>4</div>  
<div>5</div>

输出 :


回到正题:

类数组对象如何作为数组使用

先看看arguments:

  • 我在介绍arguments的文章中记录了从MDN摘抄的arguments转数组的方法:
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015 
//The Array.from() method creates a new Array instance
// from an array-like or iterable object.
const args = Array.from(arguments);
  • 前两个方法都是使用了同一种方法:
    数组的slice方法.call ( arguments )

call()方法是干什么的?

  • 在MDN中是这样介绍的:
    可以让call()中的对象调用当前对象所拥有的function

  • 这儿可以看看我个人对call()方法的一点理解

  • 结合上面的例子:
    var args = [].slice.call(arguments);
    call()中的对象 : arguments
    当前对象 : []

  • 这时我们就很容易理解这句语句了:
    arguments调用数组的slice( )方法,并且将调用后的返回值赋给args语句,可以理解为下面这条语句:
    var args = arguments.slice()
  • 虽然我们可以如此理解,但却不能这样写代码,因为arguments并不是一个数组,没有数组的slice方法,但又因为它是类数组的,因此它可以使用slice方法
    此时我们便不需要专门为arguments定义一个slice方法,call方法的作用便在于此

上面的问题有了结果

凭借着call方法,我们可以让目前操作的对象(arguments)去使用别的对象(array)的方法


说完了arguments,再来看HTML Collection就简单多了

HTML Collection如何当做数组处理

  • 在获取到对应的元素集之后,我们可能需要遍历该元素集来进行操作
    我们可以使用for循环来正确的遍历这个元素集,得到我们想要的东西
var col = document.getElementsByTagName('div');
for( var i = 0; i < col.length; i ++){
     console.log(col[i]);
}

输出 :


在上面的函数中,我们用到了col.length以及col[0],这些难道不是数组的方法吗?HTML Collection本身就是数组吗?

修改一下上面的代码:

var col = document.getElementsByTagName('div');
console.log(typeof col);
col.forEach(function(val){
  console.log(val);
});

输出 :

  • 可以看出,元素集的类型是对象,也没有数组的方法,查看下MDN中对它的介绍,发现它只有一个只读的length属性以及两个方法item()namedItem(),并没有forEach()方法,这便解释了上面的代码为何不能运行

  • 结合上面的arguments的例子,我们便可以写出HTML Collection使用数组方法的代码:

JavaScript :

var col = document.getElementsByTagName('div');
[].forEach.call(col,function(val){
  console.log(val);
});

输出 :

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容