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伪数组和数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • javascript 伪数组实现方法

    这篇文章来回答javascript通用循环遍历方法forEach中最后提到的关于伪数组的问题. 什么是伪数组 能通过Array.prototype.slice转换为真正的数组的带有length属性的对象. 这种对象有很多,比较特别的是arguments对象,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组. 我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变

  • JavaScript伪数组用法实例分析

    本文实例讲述了JavaScript伪数组用法.分享给大家供大家参考,具体如下: 在Javascript中什么是伪数组? 伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们. 1.典型的是函数的 argument参数, 2.像调用getElementsByTagName,document.childNodes之类的,它们都返回 NodeList对象都属于伪数组. 那么如何将伪数组转化为标准数组? 可以使用Array.prototype

  • js中将HTMLCollection/NodeList/伪数组转换成数组的代码

    这里把符合以下条件的对象称为伪数组 1,具有length属性 2,按索引方式存储数据 3,不具有数组的push,pop等方法 如 1,function内的arguments . 2,通过document.forms,Form.elements,Select.options,document.getElementsByName() ,document.getElementsByTagName() ,childNodes/children 等方式获取的集合(HTMLCollection,NodeLi

  • JS Array.from()将伪数组转换成数组的方法示例

    Array.from 方法用于将两类对象转换为真正的数组: 1.类似数组的对象,可以理解为"伪数组" 2.可遍历对象(比如字符串) 什么是伪数组? 伪数组都有一个基本的特点:必须有 length 属性. let arrayLike = { "0": "a", "1": "b", "2": "c", "length": 3 } 像上面的 arrayL

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

    伪数组和数组 在JavaScript中,除了5种原始数据类型之外,其他所有的都是对象,包括函数(Function). 对象与数组的关系 在说区别之前,需要先提到另外一个知识,就是 JavaScript 的原型继承. 所有 JavaScript 的内置构造函数都是继承自 Object.prototype . 在这个前提下,可以理解为使用 new Array() 或 [] 创建出来的数组对象,都会拥有 Object.prototype 的属性值. var obj = {};// 拥有 Object.

  • Javascript实现从小到大的数组转换成二叉搜索树

    废话不多说了,直接给大家贴代码了,具体代码如下所示: var Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var Tree = createTree(Array); console.log(Tree); // 构造一个节点 function Node(nodeData, leftData, rightData) { this.nodeData = nodeData; this.leftData = leftData; this.rightData = rig

  • JavaScript比较两个数组的内容是否相同(推荐)

    今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的. alert([]==[]); // false alert([]===[]); // false 以上两句代码都会弹出false. 因为JavaScript里面Array是对象,==或===操作符只能比较两个对象是否是同一个实例,也就是是否是同一个对象引用.目前JavaScript没有内置的操作符判断对象的内容是否相同. 但是惯性思维让人以为数组也是值,是可以比较的. 如果要比较数组是否相等,就只能遍历数组

  • JavaScript合并两个数组并去除重复项的方法

    本文实例讲述了JavaScript合并两个数组并去除重复项的方法.分享给大家供大家参考.具体实现方法如下: Array.prototype.unique = function() { var a = this.concat(); for(var i=0; i for(var j=i+1; j if(a[i] === a[j]) a.splice(j, 1); } } return a; }; //Demo var array1 = ["a","b"]; var ar

  • javascript实现随机读取数组的方法

    本文实例讲述了javascript实现随机读取数组的方法.分享给大家供大家参考.具体如下: function write_quote() { var quotes = [ 'no animals were harmed while making this page', 'made in ulm', 'this page was handmade', 'Get <a href="http://www.mozilla.org/products/firefox/">FireFox

  • JavaScript按值删除数组元素的方法

    本文实例讲述了JavaScript按值删除数组元素的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: function ArrayRemoveByValue(str_value,arr_remove){     var num_to_del =new  RegExp(str_value);     var db_d =new  RegExp('\,{2}');     var se_d =new  RegExp('(^\,)|(\,$)');     arr_ret = ar

  • JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象 Javascript不支持多维数组,但是因为数组里面可以包含对象(数组也是一个对象),所以数组可以通过相互嵌套实现类似多维数组的功能 1.1 定义数组 声明有10个元素的数组 复制代码 代码如下: var a = new Array(10); 此时为a已经开辟了内存空间,包含10个元素,用数组名称加 [下标] 来调用,例如

  • Javascript计算二维数组重复值示例代码

    前言 最近工作中遇到了一个问题,需求是利用Javascript计算二维数组重复值,如下面有个二维数组 [[\'error\',3],[\'error\',5],[\'error\',6],[\'true\',3],[\'true\',1]] 需要统计计算重复项 \'error\' 和 \'true\', 统计计算之后的结果: [[\'error\',14],[\'true\',4]] 实现代码: var arr = [[\'error\',3],[\'error\',5],[\'error\',

  • JavaScript学习笔记之数组去重

    推荐阅读:JavaScript学习笔记之数组的增.删.改.查 JavaScript学习笔记之数组求和方法 JavaScript学习笔记之数组随机排序 话说面试常会碰到面试官会问JavaScript实现数组去重的问题,最近刚好在学习有关于JavaScript数组相关的知识,趁此机会整理了一些有关于JavaScript数组去重的方法. 下面这些数组去重的方法是自己收集和整理的,如有不对希望指正文中不对之处. 双重循环去重 这个方法使用了两个for循环做遍历.整个思路是: 构建一个空数组用来存放去重后

随机推荐