JavaScript 数组

简介:数组是值的有序集合,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。

一:创建数组

  1. 构造函数

1).无参构造函数,创建一空数组

var a1 = new Array();

2).一个数字参数构造函数,指定数组长度(由于数组长度可以动态调整,作用并不大),创建指定长度的数组

var a2 = new Array(5);

3).带有初始化数据的构造函数,创建数组并初始化参数数据

var a3 = new Array(4,'hello',new Date());

  2.字面量

1).使用方括号,创建空数组,等同于调用无参构造函数

var a4=[];

2).使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数

var a5=[10];

我们要注意的是:

1.在使用构造函数创建数组时如果传入一个数字参数,则会创建一个长度为参数的数组,如果传入多个,则创建一个数组,参数作为初始化数据加到数组中 

     var a1=new Array(5);
console.log(a1.length);//
console.log(a1); //[] ,数组是空的 var a2=new Array(5,6);
console.log(a2.length);//
console.log(a2); //[5,6]

但是使用字面量方式,无论传入几个参数,都会把参数当作初始化内容

    var a1=[5];
console.log(a1.length);//
console.log(a1); //[5] var a2=[5,6];
console.log(a2.length);//
console.log(a2); //[5,6]

2.使用带初始化参数的方式创建数组的时候,最好最后不要带多余的”,”,在不同的浏览器下对此处理方式不一样  

    var a1=[1,2,3,];
console.log(a1.length);
console.log(a1);

这段脚本在现代浏览器上运行结果和我们设想一样,长度是3,但是在低版本IE下确实长度为4的数组,最后一条数据是undefined

二:数组的索引与长度

数组的值可以通过自然数索引访问进行读写操作,下标也可以是一个得出非负整数的变量或表达式   

    var a1=[1,2,3,4];
console.log(a1[0]); //
var i=1;
console.log(a1[i]); //
console.log(a1[++i]); //

数组也是对象,我们可以使用索引的奥秘在于,数组会把索引值转换为对应字符串(1=>”1”)作为对象属性名

 console.log(1 in a1);//true,确实是一个属性

索引特殊性在于数组会自动更新length属性,当然因为JavaScript语法规定数字不能作为变量名,所以我们不能显示使用array.1这样的格式。由此可见其实负数,甚至非数字”索引“都是允许的,只不过这些会变成数组的属性,而不是索引

    var a=new Array(1,2,3);
a[-10]="a[-10]";
a["sss"]="sss";

这样我们可以看出所有的索引都是属性名,但只有自然数(有最大值)才是索引,一般我们在使用数组的时候不会出现数组越界错误也正是因为此,数组的索引可以不是连续的,访问index不存在的元素的时候返回undefined 

     var a=new Array(1,2,3);
a[100]=100;
console.log(a.length); //
console.log(a[3]); //undefined
console.log(a[99]); //undefined
console.log(a[100]); //

上面的例子中,虽然直接对a[100]赋值不会影响a[4]或a[99],但数组的长度却受到影响,数组length属性等于数组中最大的index+1,我们知道数组的length属性同样是个可写的属性,当强制把数组的length属性值设置为小于等于最大index值时,数组会自动删除indexd大于等于length的数据,在刚才代码中追加几句

    a.length=2
console.log(a);//[1,2]

这时候会发现a[2]和a[100]被自动删除了,同理,如果把length设置为大于最大index+1的值的时候,数组也会自动扩张,但是不会为数组添加新元素,只是在尾部追加空空间

    a.length=5;
console.log(a); //[1,2] //后面没有3个undefined

三:元素添加/删除

基本方法

上面例子已经用到向数组内添加元素方法,直接使用索引就可以(index没必要连续)

var a=new Array(1,2,3);
a[3]=4;
console.log(a);//[1, 2, 3, 4]

前面提到数组也是对象,索引只是特殊的属性,所以我们可以使用删除对象属性的方法,使用delete 删除数组元素

delete a[2];
console.log(a[2]); //undefined

这样和直接把a[2]赋值为undefined类似,不会改变数组长度,也不会改变其他数据的index和value对应关系

栈方法

上面例子总有同学就发现了,尤其是其删除方法,并不是我们希望的表现形式,我们很多时候希望删除中间一个元素后,后面元素的index都自动减一,数组length同时减一,就好像在一个堆栈中拿去的一个,数组已经帮我们做好了这种操作方式,pop和push能够让我们使用堆栈那样 __LIFO(Last-In-First-Out)后进先出__ 使用数组

var a=new Array(1,2,3);
a.push(4);
console.log(a);//[1, 2, 3, 4]
console.log(a.length);//
console.log(a.pop());//
console.log(a); //[1, 2, 3]
console.log(a.length);//

队列方法

既然栈方法都实现了,__队列FIFO(First-In-First-Out)先进先出__怎么能少,shift方法可以删除数组index最小元素,并使后面元素index都减一,length也减一,这样使用shift/push就可以模拟队列了,当然与shift方法对应的有一个unshift方法,用于向数组头部添加一个元素

     var colors = new Array();                   //创建一个数组
var count = colors.push("red", "green"); //推入两项
alert(count); //2
count = colors.push("black"); //推入另一项
alert(count); //3
var item = colors.shift(); //取得第一项
alert(item); //"red"
alert(colors.length); //

unshift可以和pop配合可以从相反的方向模拟队列

    var colors = new Array();                     //创建一个数组
var count = colors.unshift("red", "green"); //推入两项
alert(count); //
count = colors.unshift("black"); //推入另一项
alert(count); //3
var item = colors.pop(); //取得最后一项
alert(item); //"green"
alert(colors.length); //2

重排序方法

数组中已经存在两个重新排序的方法,reverse()和sort(),其中reverse()仅仅用来反转数组顺序:

    var a = [1,8,9,12,21,2];
a.reverse();
alert(a); //[2,21,12,9,8,1];

在默认的情况下,sort()方法安装升序排列数组项,但是,为了实现排序,sort()方法会调用每个数组项的toString()方法,然后比较的是字符串。

    var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //0,1,10,15,5

但是这个样子,比较排序数字就不是很好了,但是sort方法可以接收一个比较函数当作参数,以便指定哪个值位于哪个值前面。这个函数很简单,有两个参数,如果第一个参数位于第二个参数之前。返回负数,如果相等,返回0。反之,则返回正数:

    function compare(value1,value2){
if(value1 < value2){
return -1;
}else if(value1 > value2){
return 1;
}else{
return 0;
}
}

当然也可以非常简单的写成这个样子:

    function compare(value1,value2){
return value1 - value2;
}

只要将这个函数传递给sort即可:

    var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values); //0,1,5,10,15

当然,如果要降序排列的话,改变一下负数和正数的方向即可

    function compare(value1,value2){
if(value1 < value2){
return 1;
}else if(value1 > value2){
return -1;
}else{
return 0;
}
}

操作方法

concat()方法用于拼接数组,a.concat(b)返回一个a和b共同组成的新数组(a,b均为数组),直接看下例子:

    var colors = ["red", "green", "blue"];
var colors2 = colors.concat("yellow", ["black", "brown"]);
alert(colors); //red,green,blue
alert(colors2); //red,green,blue,yellow,black,brown

slice()根据传入参数,返回当前数组中的一个或者多个项创建一个新数组,__slice()方法不会影响原数组__,slice()方法可以接收一个或两个参数,即数组的开始和结束位置,看下面例子:

var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);
alert(colors2); //green,blue,yellow,purple
alert(colors3); //green,blue,yellow

注意返回的结果并不包括起始和结束位置的值

splice方法

JavaScript提供了一个splice方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数

1.开始索引

2.删除元素的位移

3.插入的新元素,当然也可以写多个

__删除__

指定前两个参数,可以使用splice删除数组元素,同样会带来索引调整及length调整

var a=new Array(1,2,3,4,5);
console.log(a.splice(1,3));//[2, 3, 4]
console.log(a.length);//
console.log(a);//[1,5]

如果数组索引不是从0开始的,那么结果会很有意思,有一这样数组

var a=new Array();
a[2]=2;
a[3]=3;
a[7]=4;
a[8]=5;

console.log(a.splice(3,4)); //[3]
console.log(a.length); //
console.log(a); //[2: 2, 3: 4, 4: 5]


上面例子可以看到,splice的第一个参数是绝对索引值,而不是相对于数组索引,第二个参数并不是删除元素的个数,而是删除动作执行多少次,并不是按数组实际索引移动,而是连续移动。同时调整后面元素索引,前面索引不理会

__插入与替换__

只要方法第二个参数,也就是删除动作执行的次数设为0,第三个参数及以后填写要插入内容就splice就能执行插入操作,而如果第二个参数不为0则变成了先在该位置删除再插入,也就是替换效果

var a=new Array(1,2,3,4,5);
a.splice(1,0,9,99,999);
console.log(a.length); //
console.log(a);//[1, 9, 99, 999, 2, 3, 4, 5]
a.splice(1,3,8,88,888);
console.log(a.length);//
console.log(a);//[1, 8, 88, 888, 2, 3, 4, 5]

位置方法

__indexOf()lastIndexOf()__,这两个方法都接收两个参数:要查找的项和表示要查找位置的索引(可选),区别只是一个从开头开始找,一个从尾部开始找。

    var numbers = [1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4)); //3
alert(numbers.lastIndexOf(4)); //5
alert(numbers.indexOf(4, 4)); //5
alert(numbers.lastIndexOf(4, 4)); //3
var person = { name: "Nicholas" };
var people = [{ name: "Nicholas" }];
var morePeople = [person];
alert(people.indexOf(person)); //-1
alert(morePeople.indexOf(person)); //0

迭代方法

ECMAScript5为数组定义了5个迭代方法。每个方法都接受两个参数,第一个是进行迭代的函数,第二个是该函数的作用域对象【可选】。

进行迭代的函数接受三个参数,第一个是数组中要进行迭代的元素的值,第二个是数组候总要进行迭代的元素的位置,第三个是迭代数组本身。
1. every()对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true。
2. filter() 对数组中的每一项运行给定的函数,返回该函数返回true的项组成的数组。
3. forEach() 对数组中的每一项运行给定的函数,这个方法没有返回值
4. map() 对数组中的每一项运行给定的函数,返回每次函数调用的结果组成的数组
5. some()对数组中的每一项运行给定的函数,如果该函数对任意一项返回true,则返回true。
使用起来非常的简单方便,直接看下例子:

     var num = [1,2,3,4,5,6,7,8,9];
var everyResult = num.every(function(item, index, array) {
if(item > 2) {
return true;
}
});
alert(everyResult); var someResult = num.some(function(item) {
if(item > 2) {
return true;
}
});
alert(someResult); var filterResult = num.filter(function(item) {
if(item > 2) {
return true;
}
});
alert(filterResult); var mapResult = num.map(function(item) {
if(item > 2) {
return true;
}
});
alert(mapResult); var forEachResult = num.forEach(function(item) {
if(item > 2) {
return true;
}
});
alert(forEachResult);

JavaScript 数组的更多相关文章

  1. Javascript数组操作

    使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间:思虑下,堪能如此继续之?当狠心深学下方是正道. 原文链接 ...

  2. Javascript数组操作(转)

    1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...

  3. 也谈面试必备问题之 JavaScript 数组去重

    Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. ...

  4. js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法

    var  questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf ...

  5. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

  6. 【读书笔记】-- JavaScript数组

    数组是一段线性分配的内存,它通过整数计算偏移并访问其中的元素.大多数的语言都会要求一个数组的元素是相同类型,但JavaScript数组可以包含任意类型. var misc = ['string', n ...

  7. 什么才是正确的javascript数组检测方式

    前面的话 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具——typeof ...

  8. javascript数组对象排序

    javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...

  9. javascript数组的知识点讲解

    javascript数组的知识点讲解 阅读目录 数组的基本方法如下 concat() join() pop() push() reverse() shift() sort() splice() toS ...

随机推荐

  1. PHP 查看安装信息

    1.运行PHP脚本,查看phpinfo函数的输出. 2.在系统环境变量Path中配好php.exe可执行文件的路径,命令管理器CMD中,执行`php.exe -i`查看. 3.在phpinfo()的输 ...

  2. 使用 Git Hooks 实现自动项目部署

    最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式. 关于 ...

  3. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  4. spring mvc <mvc:annotation-driven/> 自定义拦截器不走

    <mvc:annotation-driven/> 这个便签会注册2个自定义拦截器,所以导致请求过来就会自己去走注册的这2个拦截器和定义的一堆bean 但是这个便签是必须得定义的 直接贴代码 ...

  5. 怎么写makefile?(转)

    跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...

  6. tableview最后一行显示不全

    最后一行显示不全是因为表格的高度大于了控制view的高度,减小表格的高度小于的等于控制的view的高度即可

  7. 书柜的尺寸(bzoj 1933)

    Description Tom不喜欢那种一字长龙式的大书架,他只想要一个小书柜来存放他的系列工具书.Tom打算把书柜放在桌子的后面,这样需要查书的时候就可以不用起身离开了.显然,这种书柜不能太大,To ...

  8. 在js中添加新节点

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. Expression Blend 4 学习笔记

    Animation Storyboard(情节提要)在对象和时间线面板中建立和命名,定位到对象(object),通过拖动play head(播放头,时间线中垂直的黄色指示线)定位到特定的时间点,点击“ ...

  10. WiX Toolset 教程索引页

    注意:虽然WiX Toolset功能强大,但其学习曲线相对较高.请慎重选择: 若没有足够时间.没心思搞的请绕行至inno setup.installshield.nisi.setupfactory.. ...