数组,一个从零开始的家伙。

数组的概念

  1. 什么是数组?
    数组指的是数据的有序列表。通常用一对[ ]括起来
    [ ]内部每一个数值成为数组的元素
  2. 数组中每个元素都有一个位置,
    我们把这个位置称为索引(下标,index)
    数组的索引是从0 开始的
  3. 同一个数组当中,元素的类型不做任何限制
    甚至数组中的元素可以是另外一个数组
    (二维数组,三维数组)

JS中数组有哪些特点?

  1. 数组长度可以动态改变
  2. 同一个数组中可以储存不同的数据类型
  3. 每个数组都有length属性,
    用于代表数组中元素的个数.通过这个,在后面使用循环语句的时候就会解放个你的双手。

数组的创建

运用在下面两种情况比较常见

  1. 字面量方式
  2. 构造函数

字面量方式创建

  1. 所有元素都用方块号括起来
  2. 不同元素之间用逗号分隔开
["a","b",5];

创建了长度为2的数组,初始化

var colors =["red","blue"];

创建了长度为0的数组

var colors = [];
var colors =["red","blue",];

//标准浏览器为2
IE 解析为3

构造函数

  1. 构造函数在创建对象的时候才会使用
  2. 数组的构造函数创建方法
  3. Array()
  4. new Array(数组长度);
创建一个长度为0 的数组
var colors = new Array();
创建一个长度为5 的数组
var colors = new Array(5)
创建一个长度为3 的数组,三个元素分别是r...
var colors = new Array("red","green","blue")

注意

  1. 使用构造函数创建数组对象的时候,最后一个元素
  2. 千万不要添加逗号,否则会报错
  3. 使用构造只能传入一个……且要从0开始
  4. 使用构造函数创建数组对象的时候,new 关键字
  5. 其实可以省略,也可以写成Array()

var arr = new Array();
    变量      数组对象
    栈区      堆区

关于栈区和堆区的关系

  • 内存当中,实际上分为很多个区域,分别用来保存
  • 不同的数据,其中非常重要的两个区域是栈区和堆区
  • 栈区:基本数据都保存在栈区,会根据函数的结束,而去释放内存。
  • 堆区:非基本数据都保存在堆区,需要程序猿手动开辟,手动释放。
  • new 是在堆区开辟一块内存空间,用来储存对象
  • arr 是数组的引用,是通过栈区

访问和修改数组中的元素

  • 利用索引来访问数组中的元素
  • 例如: 数组长度为5
  •   0,1,2,3,4
    
  •   arr[0]
    
  •   arr[1]
    

创建一个长度为5 的数组

var arr = [10,20,30,40,50];

console.log("数组中第一个元素:"+arr[0]);
修改对应的数组位置
arr[1] = 100;
console.log(arr);

数组的长度

如何获取数组的长度

  1. 数组的名称。length
  2. 每一个数组都有一个length 属性,
  3. 用于表示数组的长度(即:元素的个数)
  4. 数组名称.length
var arr = [10,20,30,40,50]
console.log("数组的长度为"+arr.length);

如何修改数组的长度

  • 一般强类型语言中,数组的长度是固定的
  • 一旦创建成功,则不能修改数组的长度
  • 但是JS是一种弱类型语言,
  • 数组的长度可以在程序运行期间根据需要
  • 动态的发生改变
  • 数组的length不仅仅可读....
  • 修改长度的内容,会被直接移除
  • 类似undefined...
  • 通过给最后一个元素赋值来动态的修改数组长度
var arr = [4,5,6];
console.log(arr.length);//3
//给下标为11的元素赋予初始值
//...
arr[11] = 678;
console.log(arr.length);
//数组长度会变成12
//没有赋值的默认全部为undefined

数组的遍历

1. for 循环遍历数组(推荐使用)

  • 数组的长度是多少,就循环遍历多少次
  • 循环变量作为数组的下标
var arr = [10,20,30,40,60,30,80];
//数组的长度是多少,就循环遍历多少次
//循环变量作为数组的下标
for(var i = 0;i < arr.length;i++){
    console.log(arr[i]);
}

2. for.. in 循环遍历数组

  • 每循环一轮,都会把数组的下标赋值给index
  • index 就相当于拿到了数组每一个元素的下标
  • index 是从0 开始获取的
var arr = [10,20,30,40,60,30,80];
for(var index in arr){
//循环输出:0,1,2,3,4,4,5
    console.log(index);
}
//将声明变量的var进行省略
for(i in arr){
    console.log(arr[i]);
}

3. for.. each遍历数组

  • ES5 中增加的内容
  • 需要传入一个匿名函数
var arr = [4,5,8,45,55];
arr.forEach(function(element,index){
console.log(element);
console.log("index下标是"+index);
});
  • 匿名函数中需要两个参数
  • 参数1:循环遍历的那个元素
  • 参数2:循环遍历的那个下标
  • 我们可以在匿名函数内部添加额外的代码
  • 老师说这个可以额外做好多事情

数组转换方法

1. toString()

只能使用逗号链接

var arr = [50,40,30,20,99];
alert(arr.toString());
alert(arr);
console.log(....)
....

2. join()

可以使用指定的符号进行链接

var arr = [50,40,30,20,99];
alert(arr.join("->"));
</script>

栈和队列

数组的栈方法

栈:一种数据结构,特点:FILO(先进后出)

  • 向栈内部存入元素,我们称之为“入栈”(push)
  • 从栈内部移除元素,我们称之为“出栈”(pop)
  • 先入栈的元素在栈的下方
  • 后入栈的元素在栈的顶部
  • 这两个操作都是对栈顶元素进行操作
  • “吃多了拉就是队列,吃多了吐就是栈”
var arr = ["沈斌","沈杰"]
var len = arr.push("lipeng");
//push()方法返回添加成功后数组的长度
console.log(len);
console.log(arr);

//pop()出栈操作,一次只能出栈一个元素
var item = arr.pop();
//pop()方法将栈顶元素从栈顶移除
console.log(item);
console.log(arr);

数组的队列

队列也是一种数据结构,特点:FIFO(先进先出)

  • JS中也提供了模拟队列的方法
  • 1.向队列头部添加元素(unshift)
  • 从队列头部移除元素(shift)
  • 2.向队列的尾部添加
    向队列的尾部移除
  • 队列尾部的操作实际是有push和pop完成
var arr = ["a","b","c"];
var firstItem = arr.shift();
console.log(firstItem);      //a


var len = arr.unshift("王二麻子");
console.log(len);
console.log(arr);

数组的倒置方法

  • 倒置操作对原数组本身进行操作
  • 返回的也是原数组对象
  • 并不是新建数组
var arr = ["a","b","c"];
console.log("数组倒置前:"+arr);
//对数组元素进行倒置
arr.reverse();
console.log("数组倒置后:"+arr);

数组的索引方法

1. indexOf(item)

从开始向后

2. lastIndexOf(item)

从后往前
(查找最后一次出现的位置)

var arr = ["a","b","c","d","b","f"];
console.log(arr.indexOf("b"));     //1
console.log(arr.lastIndexOf("b")); //3

//indexOf(searchValue,fromIndex)
//searchValue:所需要搜索的字符
//fromIndex:从第一个元素开始进行搜索
console。log(arr.indexOf("b",2));  //4
console。log(arr.lastIndexOf("b",2));  //1
console。log(arr.indexOf("王二麻子"));  //-1
//如果元素无法查找到,则会返回-1
console。log(arr.indexOf("b",6));  //-1

获取新的数据

1. concat()

该方法用于连接两个或者多个数组

  • 至少需要传入一个参数,参数可以是元素,也可以是数组
var arr = ["a","b","c","d"];
var newArr = arr.concat(["e","f"]);
console.log(newArr.length);  //6
console.log(arr.length);     //4

//把两个元素和一个数组全部进行拼接,
//实际出现的会是一个完整的“新数组”
var newArr_2 = arr.concat("e","f",["g","h"]);
console.log(newArr_2.length); //8

2. slice()

arr.slice()

  • 截取数组,并
  • 参数
  • start:
    • 必选
    • 如果是负数,表示从尾部开始截取
    • -1 -> 表示最后一个元素
  • end:
    • 可选
    • 截取到指定的位置
    • 不包括end的位置
    • 如果没有给定end,
    • 则表示截取到最后位置
  • end 要大于 start,否则无法截取元素
  • 截取出来的是一个新数组,对原始数组没有任何影响
var arr = ["a","b"..."e"]
console.log(arr.slice(3);//d,e
console.log(arr.slice(-1));//e
console.log(arr.slice(2,1));//空
console.log(arr.slice(-3,-2));//c

3. splice() (重点)

arr.plice(index,howmany,item1...itemN)

  • 该...
  • 返回被删除的数组
  • 参数
    • index:必要参数
      • 规定 添加/删除 元素位置
      • 使用负数可以从数组的尾部开始
        //添加元素
var arr = ["a","b","c","d","e"];
var v = arr.splice(1,0,"asd","qwe");
//因为是添加元素,所以返回的v 的长度为0
console.log(v.length);//0
console.log(arr.length);//7
//因为插入位置为1,所以添加在其后面的自动往后挪

//删除元素

var arr = ["a","b","c","d","e"];
var deleted = arr.splice(1,2);
console.log(deleted);//b,c
console.log(arr);    //a,d,e

//替换元素 (用的特别多)

var arr = ["a","b","c","d","e"];
var change = arr.splice(1,1,"bbbb");
console.log(change); 
console.log(arr); 

  • howmany :必要参数
  • 要删除的元素
  • item:可选参数
  • 替换
## 系统关键字
我们可以利用系统的关键字来完成对数组的删除操作
* delete 删除元素,数组长度不会发生改变
* 只会将对应的数值进行删除
* 对应数值变为undefined

var arr = [1,2,3,4,5];
console.log(arr);
delet arr[3];

```
console.log(arr.length); //5
console.log(arr[3]);     //undefined
console.log(arr);        //1,2,3,5
```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Javascript有很多数组的方法,有的人有W3C的API,还可以去MDN上去找,但是我觉得API上说的不全,M...
    顽皮的雪狐七七阅读 4,062评论 0 6
  • js中数组是比较常用的对象,同时js中的数组也十分的灵活。一. 创建数组的方式 字面量数组 var arr=[1,...
    饥人谷_廖珍阅读 578评论 0 2
  • 由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaS...
    2bc5f46e925b阅读 1,960评论 0 16
  • 数组方法里push、pop、shift、unshift、join、split分别是什么作用。(*) (push、p...
    coolheadedY阅读 705评论 0 0
  • js简介 Js是一种基于事件和对象驱动的解释性、松散性的语言。 一切皆对象 javascript 布兰登艾奇 ...
    塔库纳玛哈哈阅读 1,190评论 0 2