JavaScript伪数组和数组的使用与区别

 更新时间:2021年05月07日 14:17:52   作者:流楚丶格念  
这篇文章主要给大家介绍了关于JavaScript伪数组和数组使用与区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

伪数组和数组

在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function)。

对象与数组的关系

在说区别之前,需要先提到另外一个知识,就是 JavaScript 的原型继承。

所有 JavaScript 的内置构造函数都是继承自 Object.prototype 。

在这个前提下,可以理解为使用 new Array() 或 [] 创建出来的数组对象,都会拥有 Object.prototype 的属性值。

var obj = {};// 拥有 Object.prototype 的属性值
var arr = [];
//使用数组直接量创建的数组,由于 Array.prototype 的属性继承自 Object.prototype,
//那么,它将同时拥有 Array.prototype 和 Object.prototype 的属性值

可以得到对象和数组的第一个区别:对象没有数组 Array.prototype 的属性值。

什么是数组

数组具有一个最基本特征:索引,这是对象所没有的,下面来看一段代码:

var obj = {};
var arr = [];
 
obj[2] = 'a';
arr[2] = 'a';
 
console.log(obj[2]); // => a
console.log(arr[2]); // => a
console.log(obj.length); // => undefined
console.log(arr.length); // => 3
  • obj[2]输出'a',是因为对象就是普通的键值对存取数据
  • 而arr[2]输出'a' 则不同,数组是通过索引来存取数据,arr[2]之所以输出'a',是因为数组arr索引2的位置已经存储了数据
  • obj.length并不具有数组的特性,并且obj没有保存属性length,那么自然就会输出undefined
  • 而对于数组来说,length是数组的一个内置属性,数组会根据索引长度来更改length的值
  • 为什么arr.length输出3,而不是1
    • 在给数组添加元素时,并没有按照连续的索引添加,所以导致数组的索引不连续,那么就导致索引长度大于元素个数

什么是伪数组

  1. 拥有 length 属性,其它属性(索引)为非负整数(对象中的索引会被当做字符串来处理,这里你可以当做是个非负整数串来理解)
  2. 不具有数组所具有的方法

伪数组,就是像数组一样有 length 属性,也有 0、1、2、3 等属性的对象,看起来就像数组一样,但不是数组,比如:

var fakeArray = {
  "0": "first",
  "1": "second",
  "2": "third",
  length: 3
};
 
for (var i = 0; i < fakeArray.length; i++) {
  console.log(fakeArray[i]);
}
 
Array.prototype.join.call(fakeArray,'+');

常见的伪数组有:

  • 函数内部的 arguments
  • DOM 对象列表(比如通过 document.getElementsByTags 得到的列表)
  • jQuery 对象(比如 $("div") )

伪数组是一个 Object,而真实的数组是一个 Array。

伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多方法,比如:

var arr = Array.prototype.slice.call(arguments);
 
Array.prototype.forEach.call(arguments, function(v) {
  // 循环arguments对象
});

// push
// some
// every
// filter
// map
// ...

以上在借用数组的原型方法的时候都可以通过数组直接量来简化使用:

var obj = {
  0: 'a',
  1: 'b',
  2: 'c',
  length: 3
}

;[].push.call(obj, 'd')

console.log([].slice.call(obj))

;[].forEach.call(obj, function (num, index) {
  console.log(num)
})

二者区别

1.长度:

  • 真数组的长度是可变的
  • 伪数组的长度不可变

2.方法的使用:

  • 真数组可以使用数组中的方法
  • 伪数组不可以使用数组中的方法

小结

对象没有数组 Array.prototype 的属性值,类型是 Object ,而数组类型是 Array
数组是基于索引的实现, length 会自动更新,而对象是键值对
使用对象可以创建伪数组,伪数组可以正常使用数组的大部分方法

总结

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

相关文章

  • 微信小程序实现签到功能

    微信小程序实现签到功能

    这篇文章主要为大家详细介绍了微信小程序实现签到功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • element-ui 实现输入框下拉树组件功能

    element-ui 实现输入框下拉树组件功能

    这篇文章主要介绍了element-ui 实现输入框下拉树组件功能,使用element-ui的 el-input,el-tree,el-popover组件组合封装,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 详解javascript立即执行函数表达式IIFE

    详解javascript立即执行函数表达式IIFE

    本文主要介绍了javascript立即执行函数表达式IIFE的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • js实现一键换肤效果

    js实现一键换肤效果

    这篇文章主要为大家详细介绍了js实现一键换肤效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JS+HTML实现的圆形可点击区域示例【3种方法】

    JS+HTML实现的圆形可点击区域示例【3种方法】

    这篇文章主要介绍了JS+HTML实现的圆形可点击区域,结合实例形式分析了javascript结合HTML元素属性实现一个圆形的可点击区域相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • 一个页面元素appendchild追加到另一个页面元素的问题

    一个页面元素appendchild追加到另一个页面元素的问题

    一般都是自己创建元素然后append到页面的但是如果是页面本身有的元素append到另一个页面元素呢,很多的新手朋友对此问题比较好奇,本人也是如此啊,好了不多说,切入主题,感兴趣的朋友可以了解下哦
    2013-01-01
  • 微信小程序实现翻牌小功能

    微信小程序实现翻牌小功能

    这篇文章主要为大家详细介绍了微信小程序实现翻牌小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • js获取鼠标点击的位置实现思路及代码

    js获取鼠标点击的位置实现思路及代码

    常用的是 event.clientX和event.clientY分别获取横向的和纵向的位置,但仅使用这个方法是不够的,感兴趣的朋友可以了解本文
    2014-05-05
  • Laravel中常见的错误与解决方法小结

    Laravel中常见的错误与解决方法小结

    大家在用Laravel框架期间可能会遇到了不少问题,现在我将自己遇到的一些问题总结出来,有一些调试起来着实不太容易,本文筛选出几个,希望这篇文章能让大家在PHP开发中少走一些弯路。
    2016-08-08
  • 图文详解JavaScript的原型对象及原型链

    图文详解JavaScript的原型对象及原型链

    许多人对JavaScript的原型及原型链仍感到困惑,网上的文章又大多长篇大论,令读者不明觉厉。下面小编将用最简洁明了的图文介绍JavaScript的原型及原型链。
    2016-08-08

最新评论