JavaScript伪数组和数组

伪数组和数组

在JavaScript中,除了5种原始数据类型以外,其余全部的都是对象,包括函数(Function)。javascript

对象与数组的关系

在说区别以前,须要先提到另一个知识,就是 JavaScript 的原型继承。
全部 JavaScript 的内置构造函数都是继承自 Object.prototype
在这个前提下,能够理解为使用 new Array()[] 建立出来的数组对象,都会拥有 Object.prototype 的属性值。java

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

能够获得对象和数组的第一个区别:对象没有数组 Array.prototype 的属性值。数组

什么是数组

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

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、一、二、3 等属性的对象,看起来就像数组同样,但不是数组,好比:ide

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。函数

伪数组存在的意义,是可让普通的对象也能正常使用数组的不少方法,好比:atom

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

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

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

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.长度:prototype

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

2.方法的使用:code

  • 真数组能够使用数组中的方法
  • 伪数组不能够使用数组中的方法

小结

  • 对象没有数组 Array.prototype 的属性值,类型是 Object ,而数组类型是 Array
  • 数组是基于索引的实现, length 会自动更新,而对象是键值对
  • 使用对象能够建立伪数组,伪数组能够正常使用数组的大部分方法
相关文章
相关标签/搜索