JavaScript-7.数组

数组读写

数组是对象的特殊形式,只是将对象的属性变成索引并省略了

var o = {}
o[1] = 'one'
//输入是{1:'one'}

数组可以从原型中继承元素。es5中数组可以定义元素的getter和setter方法

数组元素的添加和删除

1
2
3
4
5
6
7
8
9
10
11
<!-- 向数组尾部追加元素 -->
var a = [];
a.push('last');等价于 a[length] = 'last';//向数组末尾添加一个元素;

<!-- 向数组首部添加元素 -->
a.unshift('first')

<!-- 删除数组元素 -->
a.pop();//删除最后一位元素,返回新的长度(与push一组)
a.shift();//删除第一位元素,返回新的长度(与unshift一组)
delete a[0];//此操作会只会将a[0]赋值为undefined,数组长度不会改变

数组遍历

数组遍历最常用的就是for循环

1
2
3
var keys = Object.keys(o);//此方法可以获得对象o的属性名所组成的数组
contiune //跳出当前循环,进行下一次循环
使用for/in循环遍历稀疏数组

数组方法 ☆☆☆☆☆

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
1.Array.join()方法  //将数组元素转化成字符串拼在一起,可传入分隔符,默认是','
join方法的逆向方法是 String.split() //将字符串转化成数组,传入分隔符
以上方法都是创建新数组,不改变原来数组

2.Array.reverse()方法 //颠倒数组的顺序,直接改变原数组
该方法会修改原数组

3.Array.sort()方法 //排序数组,并返回排序后数组。没有参数则按照字母表排序,undefined会被排到末尾
可以传入比较函数,第一个函数在前,则需要返回一个小于0的值,如果相等则等于0 反之大于0
该方法会修改原数组

4.Array.concat()方法 //连接2个数组,并且是连接2个数组中的每个元素,并不会递归
例:var a = [1,2,3];a.concat([1,[1,[1]]]);这个会返回 [1,2,3,1,[1,[1]]]
该方法不会修改原数组

5.Array.slice()方法 //返回指定数组的片段或者子数组 传入2个参数分别代表开始的位置和结束位置
返回数组包含开始的位置,和到不包含结束位置的所有元素
例:var a = [1,2,3,4,5] a.slice(0,2);//返回 [1,2] 到第二个位置但是不包含第二个
如果只有一个参数则表示从开始位置包括开始位置之后的所有元素
例:var a = [1,2,3,4,5] a.alice(1); //返回[2,3,4,5]
如果参数中出现负数则表示数组中最后一位元素的位置 如 -1 代表最后一位元素 -3 代表倒数第三位
例:var a = [1,2,3,4,5] a.slice(-3,-1);//返回[3,4]
ps:此方法始终是从左往右数,如果开始参数是-1 结束参数不为空则这是个空数组
该方法不会修改原数组

6.Array.splice()方法 //在数组中插入或者删除元素
第一个参数指定插入或者删除的起始位置
第二个参数是删除元素的个数 (如果没有第二个参数则从开始到结束位置都被删除)
PS:该方法返回一个由被删除元素组成的数组,没有删除返回空数组。原数组变成删除后的数组
例:var a = [1,2,3,4];a.splice(1,2);//返回[2,3] a现在是[1,4]
后面参数的都表示需要插入的参数,从第一个参数位置之前插入,此方法不会连续递归
例1:var a =[1,2,3,4];a.splice(0,0,-2,-1,0);//a返回[-2,-1,0,1,2,3,4]
例2:var a =[1,2,3,4];a.splice(0,0,-2,-1,[0]);//a返回[-2,-1,[0],1,2,3,4]

7.Array.toString()/toLocalString()方法 //和不加参数的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
47
1.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
16
var 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,’ ‘);//生成新字符串以空格隔开

PS:字符串是不可变的值,因此当做数组看待时他们是只读的,因此修改数组的方法是无效的,并且出错时候没有提示;