数组
1.1、创建
- var arr0 = new Array(num);
- var arr1 = [a1, a2, a3, 'a4'];
1.2、读写
- 通过 arr[idx] 数字来索引
- 实际上Array也是对象,所以也可以通过非数字来读取属性
1.3、稀疏数组:非连续数字索引的数组对象,通常length属性大于数组元素个数。其实与数组对象是一样的,只是对应索引的值查询出来的多了很多undefined。
例如:
var a = []; a.[1000] = 1; console.log(a.length); // 1001
1.4、数组长度
特性: 1、必定大于元素索引,通常为最大元素索引值+1,当设置索引为i的时候,如果i大于或等于数组长度,则数组长度变为i+1(如果把数组长度设置为比当前数组长度大的值会创建一段空的数组空间)
2、如果将数组长度设置为小于当前数组长度的非负整数,数组元素会删除掉大于或等于数组长度的索引值对应的元素
1.5、数组元素的添加和删除
- push() 往数组尾塞进一个元素
- pop() 相当于设置length为当前值-1,然后返回被删除的元素
- unshift() 往数组头塞进一个元素
- shift() 从数组头部删除一个元素
- delete 把对应的元素转换成unidfined,不会改变length属性
- splice(start, end, obj0, obj1) 通用的插入、删除、替换元素
1.6、数组遍历
一般使用 for var循环,在不是稀疏数组和没有手动添加非数字索引属性的情况下也可以用for in循环遍历
2.1、数组方法ECMAScript3
- join 连接数组元素
- reverse 翻转
- sort 排序
- concat 合并2个数组
- slice 返回截取的数组,不改变原有数组结构
- splice 插入、删除、替换
- push与pop
- shift与unshift
- toString与toLocaleString
2.2、数组方法ECMAScript5
- forEach
- map
- filter
- every和some
- reduce和reduceRight
- indexOf和lastIndexOf
兼容不支持ES5的浏览器
var extend = function (a, b) { if (!a || !b) return a || b; for (var i in b) { if(!a.hasOwnProperty(i)) a[i] = b[i]; } return a; }; //添加ECMAScript5数组方法 extend(Array.prototype, { forEach: function (func) { if (typeof func !== 'function') return this; var len = this.length; for (var i = 0; i < len; i++) { func(this[i]); } return this; }, map: function (func) { if (typeof func !== 'function') return this; var len = this.length, result = [ ], tmp; for (var i = 0; i < len; i++) { tmp = this[i]; if (tmp === undefined) { result.push(undefined); continue; } result.push(func(tmp)); } return result; }, filter: function (func) { if (typeof func !== 'function') return this; var len = this.length, result = [ ], tmp; for (var i = 0; i < len; i++) { tmp = this[i]; if (tmp === undefined) continue; if (func(tmp)) result.push(tmp); } return result; }, every: function (func) { if (typeof func !== 'function') throw TypeError(); var result = true, len = this.length; for (var i = 0; i < len; i++) { if (!func(this[i])) result = false; } return result; }, some: function (func) { if (typeof func !== 'function') throw TypeError(); var result = false, len = this.length; for (var i = 0; i < len; i++) { if (func(this[i])) result = true; } return result; }, reduce: function (func, initValue) { if (typeof func !== 'function') throw TypeError(); var result = initValue || this[0], len = this.length, tmp = initValue ? 0 : 1; if (!result) throw TypeError(); for (var i = tmp; i < len; ) { result = func(result, this[i++]); } return result; }, reduceRight: function (func, initValue) { if (typeof func !== 'function') throw TypeError(); var len = this.length, result = initValue || this[len-1], tmp = initValue ? len : len-1; if (!result) throw TypeError(); for (var i = tmp; i > 0; ) { result = func(result, this[i--]); } return result; }, indexOf: function (o, idx) { idx = idx || 0; if (isNaN(idx)) throw TypeError(); var len = this.length, tmp = idx >= 0 ? idx : len+idx; for (var i = tmp; i < len; i++) { if (this[i] === o) return i; } return -1; }, lastIndexOf: function (o, idx) { idx = idx || 0; if (isNaN(idx)) throw TypeError(); var len = this.length, tmp = idx >= 0 ? idx : len+idx; for (var i = len; i >= tmp; i--) { if (this[i] === o) return i; } return -1; } });
2.3、数组类型(ES5支持Array.isArray())
ES3:
var extend = function (a, b) { if (!a || !b) return a || b; for (var i in b) { if(!a.hasOwnProperty(i)) a[i] = b[i]; } return a; }; extend(Array, { isArray: function (o) { return typeof o === 'object' && Object.prototype.toString.call(o) === '[object Array]'; } });
2.4、类数组对象的字符串:可以通过[]来索引字符串中的字符