私人定制javascript中数组小知识点(Only For Me)
先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊。
2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了。 老公:滚犊子,安不好我整死你!
数组的概念
javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性。
创建数组
1.var a=new Array();//等同于[]
2.var a=new Array(10); //指定长度的数组
3.var a=new Array(1,2,“marry you”);
4.var a=[];
数组是动态的
首先数组是可以通过[]来访问数组元素,使用此语法可以读写数组,其中[]内的是小于232非负整数作为属性名时数组会自动维护其length。首先清晰的区分数组的索引和对象的属性名,所有的索引都是属性名,但只有0~232-2之间的整数属性名才是索引。
所有的数组都是对象,可以给数组对象创建任意名字的属性。但是如果使用的属性是数组的索引,数组的特殊行为就会更具需要去更新其length属性值。
这会纠正一个javascript数组“越界”错误的概念,如果试图访问数组索引超出其长度,则不会报错,只会返回undefined值。
稀疏数组和稠密数组
概念是值包含从0开始的不连续索引的数组。也可以这么理解,就是length属性值大于元素的个数。那么这样就会比正常的稠密数组在内存利用率更高,但查找效率基本一致。
此时可以用in来检测
var a1=[,,,];
0 in a1//false
数组元素的添加和删除
最简单的删除方式是var a=[1,2,4]; a.length=0;
同样你也可以用Object.defineProperty()让数组length属性变成只读
var a=[1,2,4]; Object.defineProperty(a,"length",{writable:false}); a.length=0; console.log(a); //[1, 2, 4]
添加用push(1,3,4,5,7)//此处可以一次性添加多个元素
delete a[1]是不会修改数组a的length属性,就相当于给删除元素位置赋值undefined值,那么改数组也就变成了稀疏数组了。所以应该用pop()该函数会返回删除的元素
数组遍历
遍历数组用for/in或for。前者遍历是没有一定顺序,所以可以用forEach(ECMAScript 5中的新增的函数)或者for来代替,同时遍历是最好缓存数组长度例如
for(var i=0,alength=a.length;i++){ //循环体 } for(var i in a){ if(!a.hasOwnProperty(i)){ continue; //跳出循环体 //循环体 } }
数组的方法
常用方法有join()/reverse()/sort()/concat()/slice()/splice()/push()/pop()/unshift()/shift()/toString()/toLocalString()
如果你对以上都了解,那么我还是想说说其中一个方法
如果用排序少不了sort它是按照字符排序,如果遇到数字或者对一些处理后的字符排序怎么做呢
sort()该方法可以传一个匿名函数作为参数,该匿名函数就可以满足我们的一些特殊要求了,
a=['a',"bug","Good","ccc"]; a.sort(function(s,t){ var a=s.toLowerCase(); var b=t.toLowerCase(); if(a<b) return -1; if(a>b) return 1; return 0; }); //["a", "bug", "ccc", "Good"]
ECMAScript 5中新增数组方法
forEach()//遍历数组,按顺序输出,如果要break;就要用try catch来辅助了。
map()// a=[1,2,3]; a.map(function(x){return x*x;}) //[1,4,9];
filter()//a=[5,3,4,5,6]; a.filter(function(x,i){return i%2==0});//[4,6]
every()/some()/reduce()/reduceRigth()/indexOf()/lastIndexOf()等如果不知道就谷哥吧。
这里要说一点的是字符串的行为类似于数组的事实使得通用的数组方法可以应用到字符串上。
例如:
Array.prototype.filter.call("javascript",function(x){return x.match(/[^aeiou]/);}).join(""); //"jvscrpt"
结束语
简单总结就是数组表现出来的很多东西的本质其实是因为它是对象而决定的。数组中大多数的方法都是通用的,这就意味着它不仅对数组对象有效,而且对”类数组对象同样有效“如字符串行为就与字符数组类似。如果你觉得不错,那就推荐一下。