在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
伪数组,就是像数组同样有 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
document.getElementsByTags
获得的列表)$("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