JavaScript 類數組對象的定義:javascript
能夠經過索引訪問元素,而且擁有 length 屬性;java
沒有數組的其餘方法,例如
push
,forEach
,indexOf
等。數組
舉例說明prototype
var foo = { 0: 'Java', 1: 'Python', 2: 'Scala', length: 3 }
若是類數組對象須要轉化爲數組,能夠用 Array.prototype.slice.call
code
var foo = { 0: 'Java', 1: 'Python', 2: 'Scala', length: 3 } var arr = Array.prototype.slice.call(foo);
其實一開始看到這個表達式感受比較費解,後來查了一些資料,終於明白了,特別作一些說明:對象
第一, foo
原本是沒有 slice
方法的, Array.prototype.slice.call(foo)
這個表達式至關於賦予 foo
這個對象 slice
方法。blog
第二, Array.prototype.slice.call(foo);
至關於 Array.prototype.slice.call(foo, 0);
是把取一個數組(或者類數組)的子集,並做爲一個數組返回。因此當後面的做用對象是一個類數組時,就會把這個類數組對象轉換爲了一個新的數組。索引
因此,上面的一段代碼等價於ip
var foo = { 0: 'Java', 1: 'Python', 2: 'Scala', length: 3 } foo.slice = Array.prototype.slice; foo.slice();
類數組只有索引值和長度,沒有數組的各類方法,因此若是要類數組調用數組的方法,就須要使用 Array.prototype.method.call
來實現。get
例如,若是遍歷一個類數組,能夠這樣實現:
Array.prototype.forEach.call(foo, function(item){ console.log(item); });
添加一個元素
Array.prototype.push.call(foo, 'PHP'); // foo = {0: "Java", 1: "Python", 2: "Scala 111", 3: "PHP", length: 4}