数组详细与代码解析

1,什么是数组

数组是值得有序集合,每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引。js的数组是无类型的,数组元素可以是任意类型,同一个数组中的不同元素可能是对象或数组。数组元素的索引不一定要连续,元素之间可以有空隙,叫做稀疏数组 。每个数组都具有一个lengrh属性。针对非稀疏数组,length属性就是数组元素的个数,针对稀疏数组,元素的length属性比所有元素的索引要大。非稀疏是我们学习掌握的主要知识点。

2,

创建数组

1,使用数组直接量创建数组

2,调用构造函数Array()创建数组
a,调用时没有参数
b,调用时有一个数值参数,它指定长度
c,显式指定两个或多个数组元素或者数组的一个非数值元素

3、数组元素的读和写
使用[]操作符来访问数组中的一个元素。数组的引用位于方括号的左边。方括号中是一个返回非负整数值的任意表达式。使用该语法即可以读又可以写数组的元素。

4、数组的长度
1,每个数组都有一个length属性,针对非稀疏数组,length属性值代表数组中元素的个数,其值比数组中最大的索引大一。当数组是稀疏时,length属性值会大于元素个数。数组的长度会大于每一个元素的索引值。

2,设置length属性为一个小于当前数组长度的非负整数n时,当前数组中的那些索引值大于等于n的元素将从数组中删除。同时可以将length属性设置为大于当前长度的值,实际不会像数组中添加元素,它只是在数组尾部创建一个空的区域。

var array = ["a","b","c"];

console.log(array.toString());//a,b,c

console.log(array.valueOf());//["a", "b", "c"]

console.log(array);//["a", "b", "c"]

join方法可以将数组中的元素以特定的字符连接起来

console.log(array.join(""));//abc

console.log(array.join("-"));//a-b-c

pop方法会移除数组中的最后一个元素并将该元素返回,原数组改为移除最后一个元素后的数组

console.log(array.pop());//c

unshift方法会在数组的前面添加元素,可以同时接收多个参数,用逗号隔开,例如"a",“b”,并返回新数组的长度

console.log(array.unshift("d"));//4

shift方法会移除数组中的第一个元素并将其返回

console.log(array.shift());//a

通过shift方法和push方法可以实现队列的行为,shift用于从数组中的前面删除元素,而push用于从数组后面添加元素。同理,unshift和pop也可以实现,unshift用于从数组前面添加,pop用于从数组后面删除。

如果想实现栈的行为,也可以很方便的实现。用push方法从数组后面添加,同时用pop方法从数组后面删除,从而实现栈的行为,用shift和unshift也可以实现。

自己实现一个concat()方法,看这个方法就知道concat的实现原理了

var array = ["1","3","2","6","4"];

var array2 = ["a","b","c"];

Array.prototype.concatByMyself=function(array){

    for (var i = 0; i < array.length; i++) {

        this.push(array[i]);

    }

return this;

 };

console.log(array.concatByMyself(array2));//["1", "3", "2", "6", "4", "a", "b", "c"]

slice方法,我们可以理解为切片方法,就是将数组按我们的要求切成一段,但我们应该注意,这个方法不会改变原数组,不是真的把数组切成一段一段的。

slice可以接受一个或两个参数,第一个参数为处理的起始位置,第二个可选,为处理的结束位置。如果起始位置参数值为1,则是从数组的第二个元素开始处理(数组下标从零开始计算),第二个参数如果缺省,则直接处理到数组的最后,如果有值,则处理到该值的前一个元素,比如传入的是4,则处理到3,即数组的第四个元素。

var array = ["1","3","2","6","4"];

console.log(array.slice(1));//["3", "2", "6", "4"]

console.log(array.slice(1,4));//["3", "2", "6"]

如果slice传入的参数时负数怎么办呢,则按照参数值加数组长度进行处理,如果是slice(-4,-2);数组长度为5,则结果和slice(3,1)相同。

再来看看最为强大的一个方法 splice()方法:

直接来看代码运行结果:

var array = ["1","3","2","6","4"];

console.log(array.splice(1,2)); //["3", "2"]

console.log(array);//["1", "6", "4"]

传入两个参数时,第一个则为处理的起始位置,第二个参数则为需要处理元素的个数,这时候这个方法会删除处理的元素,比如这里从数组中第二个元素开始(传入参数为1,则对应数组下标为1的元素,即数组的第二个元素),处理两个元素(第二个参数为处理元素个数),然后返回被处理的元素,原数组已经改变。

console.log(array.splice(1,0,"g","h")); //[]

console.log(array); //["1", "g", "h", "3", "2", "6", "4"]

大家可能已经猜到了为什么是这个结果,我们先看前两个参数,从数组的下标为1的元素开始处理,处理0个元素,然后将g h插入在下标为1 的元素后面,所以出现了这样的结果

那如果没有传入0怎么办呢,来看看运行代码后的结果:

console.log(array.splice(1,"g","h"));[]

console.log(array);["1", "h", "3", "2", "6", "4"]

这个时候就会将g当成要处理元素的个数,当然这个是不能转换为数值的(如果能转换为数值,比如"0",就会按0来处理),所以就按0来处理了,然后将第三个参数插入得到这样的结果。

console.log(array.splice(1,2,"g","h"));//["3", "2"]

console.log(array);//["1", "g", "h", "6", "4"]

这种情况下为什么得到这个结果相信大家就明白了,先按两个参数时候处理,然后将后面的参数全部插入处理的开始位置后面。

数组还有两个查找的方法:indexOf() lastIndexOf();

var array = ["1","3","2","6","4"];

console.log(array.indexOf("3"));//1

3在数组中的下标是1,所以返回1;

那调用lastIndexOf()方法会得到什么结果呢:

var array = ["1","2","3","2","4"];

console.log(array.lastIndexOf("2"));//3

这个方法会从数组后面开始查找,返回查找到的第一个元素的下标。

如果没有找到,这两个方法都会返回-1

var array = ["1","2","3","2","4"];

console.log(array.indexOf("a")); //-1

console.log(array.lastIndexOf("a")); //-1

注意这两个方法匹配时都是使用全等进行比较,如果是下面这样:

var array = ["1","2","3",2,"4"];

console.log(array.lastIndexOf("2"));//1

则返回1,是因为字符串的"2"与数值2是不能全等的,它们的类型不同,所以不匹配;

数组还有一些迭代方法,用于处理数组中的每一个元素。

every() filter() forEach() map() some(),这些方法都会对数组中的每一项进行处理。并且都不会修改原数组。

every(),some()都返回一个布尔值,every():当对数组中的每一项进行处理都返回true,则最后这个方法返回true,否则返回false;而some()只要有一项返回true,则返回true,否则返回false;

这些方法的用法都相同:

var array = ["1","3","2","6","4"];

array.filter(function(item,index,array){

return (item>2);//["6", "4"]

})

console.log(array.filter(function(item,index,array){

    return (array[index]>3);//["6", "4"]

}));

item即为数组中的每一个元素,index即为下标,array即为该数组

再来介绍最后两个方法:reduce() , reduceRight();

reduce从数组前面开始处理,而reduceRight则相反;

var array = ["1","3","2","6","4"];

var array2 = [1,2,3,4];

console.log(array.reduce(function(prev,cur,index,array){

    return prev + cur;

}));//13264

console.log(array2.reduce(function(prev,cur,index,array){

    return prev + cur;

}));//10
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值