### javascript 類數組對象

• 擁有length屬性，其他屬性（索引）為非負整數（對象中的所有會被當做字符串來處理，這里你可以當做是個非負整數串來理解）
• 不具有數組所具有的方法

### 類數組示例：

```var a = {'1':'gg','2':'love','4':'meimei',length:5};
Array.prototype.join.call(a,'+');//'+gg+love++meimei'```

### 非類數組示例：

`var c = {'1':2};`

javascript中常見的類數組有`arguments`對象和DOM方法的返回結果。

## 類數組判斷

《javascript權威指南》上給出了代碼用來判斷一個對象是否屬於“類數組”。如下：

```// Determine if o is an array-like object.
// Strings and functions have numeric length properties, but are
// excluded by the typeof test. In client-side JavaScript, DOM text
// nodes have a numeric length property, and may need to be excluded
// with an additional o.nodeType != 3 test.
function isArrayLike(o) {
if (o &&                                // o is not null, undefined, etc.
typeof o === 'object' &&            // o is an object
isFinite(o.length) &&               // o.length is a finite number
o.length >= 0 &&                    // o.length is non-negative
o.length===Math.floor(o.length) &&  // o.length is an integer
o.length < 4294967296)              // o.length < 2^32
return true;                        // Then o is array-like
else
return false;                       // Otherwise it is not
}```

## 類數組表現

```var a = {'0':'a', '1':'b', '2':'c', length:3};  // An array-like object
Array.prototype.join.call(a, '+'');  // => 'a+b+c'
Array.prototype.slice.call(a, 0);   // => ['a','b','c']: true array copy
Array.prototype.map.call(a, function(x) {
return x.toUpperCase();
});                                 // => ['A','B','C']:```

## 類數組對象轉化為數組

`Array.prototype.slice.call(arguments)`

```var a = {'0':1,'1':2,'2':3,length:3};
var arr = Array.prototype.slice.call(a);//arr=[1,2,3]```

```// 偽數組轉化成數組
var makeArray = function(obj) {
if (!obj || obj.length === 0) {
return [];
}
// 非偽類對象，直接返回最好
if (!obj.length) {
return obj;
}
// 針對IE8以前 DOM的COM實現
try {
return [].slice.call(obj);
} catch (e) {
var i = 0,
j = obj.length,
res = [];
for (; i < j; i++) {
res.push(obj[i]);
}
return res;
}

};```