1. 创建
1 var a = [1,2.1,true,‘abc‘] 2 3 var b = new Array() 4 5 var c = new Array(10) 6 7 var d = new Array(1,2.1,true,‘abc‘)
2. 数组为对象,继承Array.prototype,可以创建属性
负数和非整数索引将自动转化为字符串作为数组的属性
浮点数和整数相等的将转为整数,作为索引 a[1.00] == a[1]
不存在“越界“问题,仅仅作为属性
不连续索引的数组为稀疏数组。足够稀疏的数组通常在实现上比稠密数组更慢、内存利用率更高,查找元素时间与普通对象查找属性一样
稀疏数组省略的元素默认undefined,
1 var a1 = [,,,] 0 in a1 // false 有地方说为true,测试多次仍是false 2 var a2 = [undefined,,,] 0 in a2 //true 3 a1.length // 3 数据直接量允许有可选的结尾逗号
3. 设置length为小于当前长度的非负整数n时,当前数组中那些索引大于等于n的值将被删除。
Object.defineProperty(a1,‘length‘,{writable:false}) //设置数组长度为只读,不能修改
delete a [1] // 不改变数组长度,使用后数组变稀疏数组 1 in a // false
4. 遍历优化
1 for(var i=0,len=a.length;i<a;i++){ 2 if(!a[i])continue; 3 //dosomething 4 }
5. Js 不支持真正的多位数组,可以数组中套数组
6. ES3定义在Array.prototype中的方法
1) join(separator) , 通过指定的分隔符进行分隔连接所有元素,分隔符为空时默认为逗号,为String.split()的逆向操作
var a1 = [1,2,3]
a1.join(‘+‘) // 1+2+3
2) reverse() , 颠倒数组中元素的顺序,不是排序, 改变原来的数组,不会创建新的数组。
var a = [3,5,1]
a.reverse() // a = [1,5,3]
3) sort(function(a,b){}) , 对数组的元素进行排序, 改变原来的数组,不会创建新的数组,
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。
要实现这一点,首先把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
var a = [3,5,1]
a.sort(function(a,b){ return a-b }) // a = [1,3,5]
4) concat(item...) , 方法不会改变现有的数组,创建一个新数组
var a = [1,2]
concat(3,[4,[5,6]]) // [1,2,3,4,[5,6]]
5) slice(start,end) , 返回一个包含从 start 到 end (不包括该元素)的新数组,不改变原数组,参数为负数时从尾部计算位置,end可省略
6) splice(index,num,item….) , 向数组中添加/删除元素,返回被删除的元素组成的数组。该方法会改变原始数组,num省略默认删除到末尾
var a = [1,2,3,4]
var b = a.splice(1,1,[1],‘b‘) //a=[1, [1],‘b‘,3,4] b=[2]
和concat()不同,splice会插入输入本身
7) push() , 数组尾部添加一个或多个元素,返回数组新长度
8) pop() , 删除数组最后一个元素,减小数组长度并返回删除的值
9) unshift() , 和push() 类似,不过是从头部添加
var a= [1,2]
a.unshift(4,5) // [4,5,1,2] 元素为一次性添加,并非逐个
10) Shift() , 和pop()类似,从头部删除
11) toString() , 和 没参数的join()返回值相同
7. ES5 中的数组方法
大部分方法第一个参数接收一个函数,数组中每个元素调用一次,稀疏函数中不存在的元素不调用,
此参数函数有三个参数:数组元素,索引,数组本身,通常只用第一个
1) forEach(function(value,index,arr){}) , 从头至尾遍历,所有元素没遍历完无法终止,除非放在try..catch 中并抛出异常
var a = [1,2,3,4]
var sum = 0
a.forEach(function(value){
sum += value //累加 , 最终sum=10
})
2) map(function(value,index,arr){}) , 不修改原数组,返回一个新数组,和原数组有相同的长度
var a = [1,,3]
var b = a.map(function(value){
return value*value
}) // b = [1,,9]
3) filter(function(value,index,arr){}) , 不改变原数组,返回调用数组的一个自己,传递的函数用来逻辑判断,如果是true元素将会添加到子集中,
会跳过稀疏函数中不存在的值,所以返回值都是稠密的
var dense = sparse.filter(function(){return true}) // 压缩稀疏函数,返回稠密的
4) every() , 当所有元素对传递的函数都返回true时 返回true,否则为false,当其中一个返回false时立即停止遍历并返回false,
稀疏数组不存在元素不遍历
5) some() , 当其中元素对传递的函数都返回true时 返回true,否则为false, 当其中一个返回true时立即停止遍历并返回true,
稀疏数组不存在元素不遍历
6) reduce(function(x,y),default) , 使用指定的函数将数组元素进行组合,生成单个值
第一次调用function时x为default,接下来x为上次的返回值
如果default没有指定,x,y 为数组的第一个和第二个元素,如果数组为空则报错
7) reduceRight 方法和reduce 相似,只是按照数组索引从高到低处理
8) indexOf(val), 寻找并返回值在数组中的索引,不存在返回-1
9) lastIndexOf(val) , 从末尾开始寻找并返回值在数组中的索引,不存在返回-1
8. 判断变量是数组 var a = []
ES3
var isArray = Function.isArray || function(o){
return typeof o === ‘object‘ && Object.prototype.toString.call(o)===‘[object Array]‘
}
ES5
Array.isArray(a)
9. 类数组对象 ,例如arguments,没有继承Array.prototype,不能直接使用数组方法,但是可以通过Function.call()
var a = {‘0‘:‘a‘,‘1‘:‘b‘,length:2}
Array.prototype.join.call(a,‘+‘) // ‘a+b’
在Firefox 中可以简写为 Array.join(a,’+’),但不是所有浏览器都可以,所以可以修改定义
Array.join = Array.join || function(a.sep){
return Array.prototype.join.call(a,sep)
}
10. ES5中字符串类似只读数组
var s = ‘javascript‘
console.log(Array.prototype.join.call(s,‘ ‘)) // j a v a s c r i p t
网上寻找 ,精简图