在JavaScript中,对象,数组,函数是最最常用的东东了,写完了对象和函数,最后来说说数组吧,提到数组,就只能想到,map,forEach啊,pop,push啊,当真是没有一点点的积累了?这么多年程序媛当真是就只学会了for循环了,人生如此美妙,你却如此浅薄无知啊,可惜啊可惜!如果你当真认为是这样,你就是个笨蛋啦。废话不多说,干货走起!
首先,说下数组元素可以是任意类型的,索引是从零开始的,数组可能是稀疏的,即数组元素的索引不一定是要连续的哦,中间可以有空缺的呦。那么数组的length针对于稀疏数组,length大于所有元素个数的和。
数组呢,是对象的特殊形式,所以它的索引实际上和碰巧是整数的属性名差不多。但是,用数字索引来访问数组元素一般来说要比访问常规的对象属性要快很多。
数组继承自Array.prototype中的属性。
1,创建数组
这里说一种不常见的创建方式
var undefs = [,,] undefined undefs (2) [empty × 2]
var a = new Array(); var b = new Array(10); var c = new Array(1,2,3,4,'thank you')
javascipt将指定的数字索引值转换成字符串----索引值1变成“1”,然后将其作为属性名来使用
var o = {};
o[1] = "one";
数组的特殊之处在于,根据需要更新他们的length属性值。
注意:可以使用负数或非整数来索引数组。事实上数组索引仅仅是对象属性名的一种特殊类型。
2,稀疏数组,length
即包含从0开始的不连续索引的数组。
var a = new Array(5); a[1000] = 0; 0 a (1001) [empty × 1000, 0]
length一个特殊之处在于,看下面的例子:
var a = [1,2,3,4,5]; a.length = 3; 3 a (3) [1, 2, 3] a.length = 0 0 a [] a.length = 5 5 a (5) [empty × 5]
3:数组的添加和删除
arr.push('one','two');//尾部插入
arr.unshift() //首部插入
delete a[1] //删除操作不影响数组原来的长度,删除后原数组变成了稀疏数组。
pop()//尾部删除一个元素
shift()//头部删除一个元素
splice() 是一个通用的插入,删除,替换操作数组的方法。
4数组的遍历
常用for循环,不能用for/in循环去检测数组,因为for/in循环能够枚举继承的属性名,如添加到Array.prototype中的方法。除非用额外的检测方法来过滤不想要的属性。
5.数组的方法:
join(),reverse(),sort(),concat(),slice(),splice()
toString()
新的数组方法来遍历,映射,过滤,检测,简化和搜索数组。
every()和some()不总是访问每一个数组元素,如果有fasle就会尽早终止遍历。
var a = [2,12,3,5,6]; a.forEach(function(v,i,a){a[i] = v+1}) a.map(function(x){return x*x}); a.filter(function(x){return x<3}) //返回的数组元素是调用的数组的一个子集。 a.every(function(x){return x<10}) //所有的值都<10 a.some(function(x){return x<10}) //存在有小于10的数就是true
重点来说说不常用的reduce函数:
var a = [2,3,4]; var result = a.reduceRight(function(x,y){ return Math.pow(y,x); })
这里的union函数自己写的,运行下貌似没问题,可以合并对象属性:
var objects = [{x:1},{y:2},{z:3}]; function union(x,y){ for(var i in y){ i in x ? null : x[i] = y[i]; } return x; } var merged = objects.reduce(union);
最后一个方法:indexOf()和lastIndexOf(),里面传值都是要检索的字段,没有就返回-1,有就返回索引,一个从前往后查找,一个从后往前查找。没啥说的。本篇结束!!!