关于javascript中伪数组和真数组的一些小秘密

 更新时间:2022年08月05日 09:31:21   作者:陆荣涛  
在javascript中,伪数组又称类数组,是一个类似数组的对象,是一种按照索引存储数据且具有length属性的对象,下面这篇文章主要给大家介绍了关于javascript中伪数组和真数组的一些小秘密,需要的朋友可以参考下

我有一个朋友,一直纠结一个问题:

arguments接受的实参是一个列表,得到的是一个像数组一样的东西,于是他想实现无限参数求和,在遍历数组求和时,使用了forEach遍历,却报错了,问这是为什么?

(真的不是我!)

代码如下:

执行代码结果:

首先我们要分析一下真数组和伪数组的本质区别;

arguments既然得到一个类似于数组的东西,使用forEach方法为什么会报错呢?

实际上,它并不是一个真正的数组,而是一个类数组或者叫伪数组,也就是一个类似于数组的东西,其实它也只是一个概念,咱们不能轻易被这些概念吓着。

下面我们一起看看什么是伪数组呢?

1.我们先来看看用于接受实参的方法 arguments , 执行代码如下:

function fn() {  
      console.log(arguments);
}
fn(1,2,3,4,5)

执行代码结果:

这里可以看到,Arguments显示的也有方括号 [1,2,3,4,5...] ,但是后面多了一些其他方法;也有length属性,但没有数组的push,pop等那些方法,像数组又不是数组。

并且从上图标注的 [[prototype]]可以看到 arguments伪数组 的原型指向的是Object对象。

2.大家也可以去打印看看其他比如getElementsByClassName 得到的

<div></dic>
<div></dic>
<div></dic>

<script>
    var oDivs = document.getElementsByTagName("div");
    console.log(oDiv);
</script>

执行查看结果:

这里可以看到:HTMLCollection显示的也有方括号 [1, 2, 3, 4, 5...] ,但是后面也多了一些其他方法;也有length属性,同样没有数组的push,pop等那些方法,也是像数组又不是数组。

也可以看出 [[prototype]]通过标签名获取页面元素拿到的伪数组的原型指向的是HTMLCollection对象

当然也还有一些其他的,这里就不一一列举了,简单说,伪数组具有以下特点:

  • 拥有length属性,可以获取长度;
  • 拥有角标索引,可以通过length属性遍历获取所有值。
  • 但是不可以使用数组的内置方法。

3.我们再来看一下数据的打印结果:

可以看到,真数组的 proto 指向的是Array数组

那么我们一起看看为什么伪数组不能使用数组的内置方法和属性呢?

从以上所述,我们也可以看出伪数组的原型不一样,其实就是不同的对象,而数组的原型是Array,他们与真数组的本质不一样。这也是伪数组为什么不能使用数组的属性和方法的根本原因,也就是说伪数组没有办法使用数组的方法。比如forEach、pop等方法,必须把他们转化为真数组才能使用数组的各种方法。

接下来我们就说说伪数组转真数组的方法:

1 最简单的方法:

//1.先声明一个空数组
let newArr = [];
//然后遍历伪数组
for (let i = 0; i < arguments.length; i++ ) {
    //将伪数组中的值通过索引逐个添加到新数组当中。
    newArr[i] = arguments[i};
}

2 利用Array的原型对象的slice方法,配合call()方法修改slice中this指向

//slice原本是数组的截取子数组的方法,这里给数组的原型对象方法slice的指向强制改成arguments
let newArr = Array.prototype.slice.call(arguments);

3 利用扩展运算符(...)将伪数组转化为真数组

//ES6语法 let newArr=[];
let newArr = [...arguments];

4 利用ES6的Array.from方法

let newArr = Array.from(arguments);

改变之后,我们就可以得到一个真正的数组,后面再使用forEach获取其他方法也就不会报错啦。

总结:

伪数组的原型是Object ,真数组的原型是Array ;

伪数组其实是键值对的形式,真数组是基于索引下标实现的;

伪数组可以通过以上4种方式转化为真数组,进而使用数组的forEach等其他方法

当然了,如果只是普通遍历也可以用for循环来实现,不需要转真数组这么麻烦,在实际开发中大家也要酌情使用哦!

到此这篇关于javascript中伪数组和真数组的文章就介绍到这了,更多相关js伪数组和真数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解通用webpack多页面自动导入方案

    详解通用webpack多页面自动导入方案

    本文主要介绍了通用webpack多页面自动导入方案,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 浅析JavaScript中变量提升的原理与使用

    浅析JavaScript中变量提升的原理与使用

    前端的小伙伴大概都知道,js中的var变量存在变量提升,在es6以后随着let变量的出现,变量提升问题得以解决,那么变量提升的原理是什么,es6又是怎么解决变量提升问题的,下面我们来共同探寻答案
    2023-05-05
  • 一步一步封装自己的HtmlHelper组件BootstrapHelper(二)

    一步一步封装自己的HtmlHelper组件BootstrapHelper(二)

    一步一步封装自己的HtmlHelper组件:BootstrapHelper,系列文章第二篇,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • List Installed Hot Fixes

    List Installed Hot Fixes

    List Installed Hot Fixes...
    2007-06-06
  • VSCode 配置uni-app的方法

    VSCode 配置uni-app的方法

    这篇文章主要介绍了VSCode 配置uni-app的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • javascript中删除指定数组中指定的元素的代码

    javascript中删除指定数组中指定的元素的代码

    已知一个数组,我们想用指定的方法对数组中的元素进行逐一操作。需要的朋友可以参考下。
    2011-02-02
  • JS+canvas绘制的动态机械表动画效果

    JS+canvas绘制的动态机械表动画效果

    这篇文章主要介绍了JS+canvas绘制的动态机械表动画效果,涉及javascript结合HTML5 canvas简单数值计算与动态绘图相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • JavaScript中的事件与异常捕获详析

    JavaScript中的事件与异常捕获详析

    这篇文章主要给大家介绍了关于JavaScript中事件与异常捕获的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • 20个你不得不知道的js位运算用法

    20个你不得不知道的js位运算用法

    位运算,那些看似晦涩但又蕴含无限魔力的数字魔术,在JavaScript开发中扮演了默默无闻却又至关重要的角色,本文介绍多个js位运算的使用场景,阐述在JavaScript中,如何巧妙运用位运算实现效率的提升和算法的优化,需要的朋友可以参考下
    2023-12-12
  • JS实现登录页面记住密码和enter键登录方法推荐

    JS实现登录页面记住密码和enter键登录方法推荐

    下面小编就为大家带来一篇JS实现登录页面记住密码和enter键登录方法推荐。小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-05-05

最新评论