博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重论JavaScript伪数组的种种
阅读量:6925 次
发布时间:2019-06-27

本文共 1748 字,大约阅读时间需要 5 分钟。

伪数组

什么是伪数组?

  • 定义:obj instanceof Array === false 但是有length属性
  • 以下是常见伪数组:
  • arguments
  • NodeList、HTMLCollection
  • jQuery对象

伪数组转为真·数组

  • Array.prototype.splice.call(obj)

自定义伪数组

类数组

//从对象构建伪数组的两个条件://1. 具有length || 具有push\unshift\pop\shift中任意一个并调用(最终结果就是生成length这个属性)//2. 具有名为splice的方法 var obj={    length:0,    splice(){}};console.log(obj);var obj2={    push:[].push,     splice(){}};obj2.push();console.log(obj2);

类数组当作数组使用的原理:length相当于obj的键名

var obj={    length:0,    splice(){},    push:Array.prototype.push};obj[0]=10;obj.push(1,2,3);console.log(obj);//[1,2,3,splice:f,push:f]var obj2={    length:1,    splice(){},    push:Array.prototype.push};obj2[0]=10;obj2.push(1,2,3);console.log(obj2);//[10,1,2,3,splice:f,push:f]//上述push也可以用apply来写{   push:function () {  return [].push.apply(this,arguments);}}

特别的,两种DOM伪数组的区别

1. getElementsByTagName 得到的是 HTMLCollections类

// 如果有一个ID为'test'的元素,可以直接取得document.getElementsByTagName('div').test
  • 如上,ID元素会被直接列在HTMLCollections对象里的同名键中
  • item(),length,namedItem()

2.querySelector 得到的是 NodeList类

document.querySelectorAll('div').forEach((a,b,c)=>{    console.log('第一个参数:' + a + '值');    console.log('第二个参数:' + b + '键');   console.log('第三个参数:' + c + '自身');});
  • forEach()
  • item(),length
  • 典型ES6对象特性,entries,keys,values

共性

for(let i=0;i
  • 实际上,通过控制台观察发现,两者都具备iterator接口,都可以支持for ... of语法

相比来讲,querySelector内置forEach,会更方便

援引Arguments来说事

const {   callee,//函数本身   length,//参数长度   [...'所有传入的参数']//可以用下标获得所有的按顺序得到的参数}=arguments;
  • 此外,arguments也具备iterator接口,可以直接用for...of遍历

总结:

  1. 伪数组基本上属于一个概念问题,只需要知道的是--伪数组的原型一定不是数组,所以,不会有数组的所有方法,在使用的时候不能想当然的去直接用Array.prototype方法比如push,pop,concat等等
  2. 伪数组转为真数组的方法有好多种,列下思路:
  • 1.遍历伪数组存入真数组
  • 2.Array.prototype.splice.call(obj)
  • 3.Array.from()
  • 4.原型继承,arr.__proto__=Array.prototype
  • 5.其他工具库中的方法,如jQuery中的makeArray()toArray()等

转载地址:http://sbujl.baihongyu.com/

你可能感兴趣的文章
如何修改博客园插入代码的默认代码大小? - 心得小记
查看>>
strcpy和memcpy的区别
查看>>
ios 一个正则表达式测试(只可输入中文、字母和数字)
查看>>
VS调试-添加命令行参数
查看>>
Mac和Windows中常见中文字体的英文名称
查看>>
[ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
查看>>
使用PHP创建一个REST API(Create a REST API with PHP)
查看>>
牛人一个
查看>>
SharePoint 2013 实现多级审批工作流
查看>>
Java泛型详解
查看>>
原创Java版的Shell
查看>>
windows phone (18) Border元素
查看>>
后端安全验证过程
查看>>
基于linux2.6.38.8内核启动过程完全解析[一]
查看>>
如何设置路由器实现静态IP配置
查看>>
4.3 spring-嵌入式beans标签的解析
查看>>
C#可以获取Excel文件中Sheet的名字
查看>>
Windows XP系统服役13年今正式退休
查看>>
HDUOJ---3743Frosh Week(BIT+离散化)
查看>>
Codeforces Round #238 (Div. 2) D. Toy Sum
查看>>