数组读写
数组是对象的特殊形式,只是将对象的属性变成索引并省略了
var o = {}
o[1] = 'one'
//输入是{1:'one'}
数组可以从原型中继承元素。es5中数组可以定义元素的getter和setter方法
数组元素的添加和删除
1 | <!-- 向数组尾部追加元素 --> |
数组遍历
数组遍历最常用的就是for循环1
2
3var keys = Object.keys(o);//此方法可以获得对象o的属性名所组成的数组
contiune //跳出当前循环,进行下一次循环
使用for/in循环遍历稀疏数组
数组方法 ☆☆☆☆☆
1 | 1.Array.join()方法 //将数组元素转化成字符串拼在一起,可传入分隔符,默认是',' |
ECMAScript 5 中的数组方法 ☆☆☆☆☆
概述:大多方法接收的第一个参数是一个函数,并且对数组的每个元素调用一次该函数。
如果是稀疏数组,即存在不存在的元素不会调用。
该函数使用3个参数分别为:数组元素,数组索引,数组本身(第一个参数为必须的)
如果数组方法有第二个参数,则表示调用函数是第二个参数的方法,也就是this指向
ECMAScript 5中的方法都不会修改原数组,传递的函数方法可以修改1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
471.Array.forEach()方法 // 为每个元素调用指定的方法
例:数组中所有元素自加1
var a = [1,2,3];a.forEach((v,i,a)=>{a[i] = v+1;})
ps:此处数组被修改是因为在传递的方法中修改了原数组
2.Array.map()方法 //将被调用数组中的每个元素传递给指定的函数,
并且返回一个包含函数返回值的数组
例:var a = [1,2,3];var b = a.map(i=>{return i*3});
返回[3,6,9];a还是[1,2,3]
PS:map方法需要返回值。返回数组具有相同的数组长度
3.Array.filter()方法;// 根据filter字面意思是过滤,返回值原数组的一个子集
传递的参数是用来判断的只返回true or false 用来确定是否过滤这个元素
例:var a = [1,2,3,4,5];var b = a.filter(item=>{return item>3});b:[4,5]
4.Array.every()/some()方法; //对数组中所有元素执行判断返回true or false
every()方法是所有元素调用判断方法后都返回true则这个数组方法返回true
如果every()第一个元素返回了false,则后面就不会继续遍历了
some()方法是有一个返回true则这个数组方法返回true
如果第一个元素返回true,则后面就不会遍历了
5.Array.reduce()/reduceRight();//对数组元素进行整合生成一个值
6.Array.indexOf()/lastIndexOf();//搜索数组中是否含有给定值的元素
如果有返回索引,没有返回-1;
其中lastIndexOf是从尾至头搜索的
例:var a = [1,2,3];a.indexOf(1);//返回0;
该方法也可以有第二个参数,可以指定数组中的一个索引,表示从当前位置开始搜索
如果搜索的值在索引之前,也会返回-1
第二个参数也可以是负数,表示相对末尾的偏移量
因为此方法找到第一个满足条件就会返回索引,不会继续搜索,下面方法可以找到所有的
例:找出数组中所有某个相同元素的索引
function getAllEle(arr,x){//arr要搜索的数组,x为要搜索的元素
var result = [];//存入找到的索引
var pos = 0;//从第0个位置开始搜索
var len = arr.length;//传入数组长度
for(var i = 0;i<len;i++){//使用for循环,并未使用书上的while循环
pos = arr.indexOf(x,pos);//开始从第0个位置搜索
if(pos == -1) break; //没有找到结束循环
result.push(pos);//找到一个放入到结果数组中
pos = pos+1;//自增1,从下个开始继续搜索
}
return result; //返回结果;
}
PS:字符串也有此方法,和此功能类似
数组类型
ECMAScript 5中提供了Array.isArray()函数来判断对象是否为数组
例:Array.isArray({})//返回false
类数组对象
类数组对象,间接调用数组方法(Function.call)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16var a = {"0":"a","1":"b","2":"c",length:3};//必须要有length属性,不然无法调用
Array.prototype.join.call(a,'+');
//这里不能直接使用a.join()因为a并没有继承自Array.prototype a上面根本就没有这个方法
ps:这里并未搞懂call方法,下一章会有解释
---看完了下一章,回过头解释下
call()方法里面第一个参数是要调用别人方法的对象,后面跟的参数是别的对象方法所需要的参数
因为ECMAScript 5中将这些方法直接定义在了Array构造函数中,所以可以直接这样写
Array.join(a,'+');//可能不是所有浏览器都支持
兼容写法
Array.join = Array.join()||function(a,sep){//a表示传入类数组对象,sep表示分隔符
return Array.prototype.join(a,sep);
}
...
作为数组的字符串
通用的数组方法可以作用于字符串上
例:s = ‘JavaScript’;
Array.prototype.join.call(s,’ ‘);//生成新字符串以空格隔开