Object->{}、[]、/^$/、时间
每一个对象都是由属性名和属性值组成的
var ary = [12,23,34,45]
数组也是对象,我们看到的是它的属性值,属性名是数字0~3。0存储的是第一项的值 1存储的是第二项的值...我们把代表第几项的这个数字的属性名叫做数组的索引
length:4 数组的长度 数组中有一个length的属性 ,这个是浏览器天生就给数组增加的(不是我们自己编写的属性),这个属性属于当前数组不可枚举的属性。
for in循环是用来遍历一个对象中属性名和属性值的,但是对于当前对象不可枚举的属性,我们通过他是遍历不到的,例如:我们无法遍历到ary.length这个属性
数组常用的方法(15个)
学习数组中常用的方法,我们需要按照四个维度去探讨
1)、方法的作用
2)、需要传哪些参数
3)、是否有返回值,返回值是什么
4)、通过此方法是否对原来的数组产生了改变
1、关于数组的增加、修改、删除
1)、push:向数组的末尾增加新的内容
参数:想向末尾增加哪些内容就传递谁,而且可以传递多个值,用逗号隔开,统一向末尾增加多项
返回:新增加后数组的长度
原来的数组已经发生了改变
扩展:不想使用push,也想向数组的末尾增加内容。
ary[ary.length] = 10
2)、pop:删除数组最后一项内容
参数:没有
返回:被删除的那一项内容
原有数组发生改变
扩展:不用pop想删除最后一项的内容
ary.length--;
3)、shift:删除数组中的第一项
参数:没有
返回:被删除的那一项
数组发生改变
4)、unshift:向数组开头增加一项
参数:增加内容
返回:数组长度
数组发生改变
5)、splice:它既能实现删除,也能实现增加,还能实现修改
[删除]
ary.splice(n,m) 从索引n开始删除m个元素,把删除的内容以一个新数组的方式返回,原来的数组改变
ary.splice(n) 从索引n开始,删除到数组的末尾
ary.splice(0) 把原来的数组中的每一项都删除掉(清空数组每一项),把之前的每一项的值以一个新的数组返回(把之前的数组克隆了一份一模一样的,只不过这样的克隆会修改原来的数组)
ary.splice() 数组中的一项都没有删除,返回的是一个空数组
[修改]
ary[2] = 340 //利用对象的操作的方式修改某一项的值,
splice(n,m,x) 从索引n开始,删除m个,用x替换删除的部分,把删除的内容以一个新的数组返回,原来的数组改变
[增加]
splice(n,0,x)从索引n开始,一个都不删除(返回结果是一个空数组),把x增加到索引n的前面,原来的数组改变
2、关于数组的截取和拼接
1)、slice:实现数据的截取,在原来的数组中截取某一部分
slice(n,m) 从索引n开始,找到索引为m,将找到的部分以一个新的数组返回,原来的数组不变
slice(n) 从索引n开始 一直找到数据末尾
slice(0) /slice() 把原来的数组克隆一份一模一样的新数组返回
思考:
分析一下slice这几种特殊的情况:n或者m为负数、n>m、n或者m已经超过了整个数组的范围
2)、concat:把两个数组拼接到一起,原来的数组不变
ary1.concat(ary2) 把ary1和ary2进行拼接,ary2在后面
ary1.concat()把ary1克隆一份一模一样的数组
3)、把数组转化成字符串
toString():把数组转化成字符串,原来的数组不变
join():按照每一个分隔符,把数组中的每一项拼接成一个字符串,原来的数组不变。
扩展:eval->js中把字符串变为js表达式执行的一个方法
console.log(eval("12+23+34+45"))//114
将数组中的每一项进行相加求和
console.log(eval(ary.join("+")));
4、数组的排序和排列
1)、reverse:把数组倒过来排序
2)、sort:给数组进行排序 原来的数组改变
ary.sort() 这样的话只能处理10以内的数字进行排序,因为它是按照UNICODE编码的值进行排序的。
ary.sort(function(a,b){return a-b}); 由小到大排序
ary.sort(function(a,b){return b-a}); 由大到小排序
5、只有在标准浏览器中兼容的方法,在ie6-8不兼容的
1)、indexOf / lastIndexOf (字符串中也有这两个方法,但是字符串的这两个方法兼容所有的浏览器,而数组的这两个方法是不兼容的) :返回元素的索引,原来的数组不变。如果返回的结果为-1,证明在数组中不存在。
2)、forEach / map 都是用来遍历 数组中的每一项的
forEach:数组中有几项,我们的函数就执行几次;函数中的形参 item 为当前遍历的值 index 为当前的索引 原来数组不变
ary.forEach(function(item,index){})
map和forEach的语法是一样的,但是比forEach多加了一个把原来内容进行替换的功能
ary.map(function(item,index){
return item*10;
})
返回的新数组是每一项都乘以10
更多的数组方法:
console.log(Array.prototype)
数组去重: (web.jobbole.com/83425)
利用对象的键值对方法:
1)、我们把数组中的每一项的值当做一个对象的属性名和属性值存起来
2)、但是在每一次存储之前,我们判断当前这一项(N)是否在对象中已经存在了。
如果obj[N]=N 说明已经存在了 ,说明已经存在,那么在数组中把这一项删除
如果是undefined 说明还没有这一项,说明当前这一项还没有重复,我们把其当做对象的属性名和属性值存储进去即可。
var ary = [1,2,3,2,12,1,2,3,4,56,12,23]
var obj = {1:1,2:2,3:3}
obj[1] = 1;
obj[2] = 2;
obj[3] = 3;
在我要存储第四项的时候,我判断一下对象中是否包含了2这一项。
obj[2] //2
obj[4]//undefined
具体代码如下:
var ary = [1,2,3,2,12,1,2,3,4,56,12,23]; var obj = {}; for(var i = 0;i<ary.length;i++){ var cur = ary[i]; if(obj[cur]==cur) {//说明对象中已经存在cur这一项了 也说明数组已经重复 //ary.splice(i,1); //元素内容较多时,后面的每一项的索引都修改了 影响性能
// 我把数组末尾的那一项拿过来替换当前项,再把数组末尾的那一项删除掉
ary[i] = ary[ary.length-1];
ary.length--;//把数组末尾的那一项的值删除掉
i--;// 解决数组 删除元素数组塌陷问题 continue; } obj[cur] = cur }