提示:数组属于JavaScript中的一种引用类型数据结构,通常用来存储多个对象
他有以下的特点
数组由方括号构成,其中包含用逗号分隔元素的列表。
比如,我们上超市购物,需要一个购物清单,那么用数组来表示,可以用下列的代码代表一个购物清单的数组
let shopping = ["bread", "milk", "cheese", "hummus", "noodles"];
shopping;
像上面的shopping 变量存储都是字符串变量,但数组可以将任何类型变量存储如字符串、数字、对象,甚至是另外一个数组,如下列代码所示
let sequence = [1, 1, 2, 3, 5, 8, 13];
let random = ["tree", 795, [0, 1, 2]];
new Array()
new Array(element0)
new Array(element0, element1)
new Array(element0, element1, /* … ,*/ elementN)
new Array(arrayLength)
Array()
Array(element0)
Array(element0, element1)
Array(element0, element1, /* … ,*/ elementN)
Array(arrayLength)
构造函数参数 :elementN
Array 构造函数会根据给定的元素创建一个 JavaScript 数组,但是当仅有一个参数且为除了数字时外
。注意,后者仅适用于用 Array 构造函数创建数组,而不适用于用方括号创建的数组字面量
arrayLength
如果传递给 Array 构造函数的唯一参数是介于 0 到 232 - 1(含)之间的整数,这将返回一个新的 JavaScript 数组,其 length 属性设置为该数字(注意:这意味着一个由 arrayLength 个空槽组成的数组,而不是具有实际 undefined 值的槽——参见稀疏数组)。
备注: 调用 Array() 时可以使用或不使用 new
。两者都会创建一个新的 Array 实例。
const arrayEmpty = new Array(2);
console.log(arrayEmpty.length); // 2
console.log(arrayEmpty[0]); // undefined;实际上是一个空槽
console.log(0 in arrayEmpty); // false
console.log(1 in arrayEmpty); // false
const arrayOfOne = new Array("2"); // 这里是字符串 "2" 而不是数字 2
console.log(arrayOfOne.length); // 1
console.log(arrayOfOne[0]); // "2"
向我们上面定义的random 数组中,我要获取 795这个变量,该如何获取,那么下面就介绍一下数组的访问和修改方法
看以下代码:
let random = ["tree", 795, [0, 1, 2]];
random [0]; //"tree"
random [1] //795
我们可以索引
,来获取数组对应的元素
random [0]
来获取1
就可以访问到如果我们想修改数组指定位置的变量的值,比如将第2个位置的795 改成 “jack”,可以通过以下代码修改
random [1] = "jack";
random[1];//"jack"
let random = ["tree", 795, [0, 1, 2]];
random.length //3
random 数组中,一个有三个元素tree,795,[0, 1, 2],因此长度为3
let myArray = ["Manchester"];
myArray.push("Cardiff");
myArray //["Manchester", "Cardiff"]
myArray通过push方法在末尾
添加一个Cardiff 字符串,最后得到 ["Manchester", "Cardiff"]
myArray.unshift("");
myArray;//["Edinburgh","Manchester", "Cardiff"]
myArray通过unshift方法在最前面
添加一个Cardiff 字符串,最后得到 ["Edinburgh","Manchester", "Cardiff"]
let removedItem = myArray.pop();
myArray; //["Edinburgh","Manchester"]
removedItem;//Cardiff
通过pop 方法,将原数组最后一个元素移除, 通过打印原数组,可以看到,myArray只剩两个元素,我们可以定义一个变量名为removedItem
,来接收被移除的元素
,而removedItem 的值刚好是被移除的元素值。
let removedItem = myArray.shift();
myArray;//["Manchester"]
removedItem;//"Edinburgh"
与pop 方法相反, shift 方法是将原数组的第一个元素移除,并返回这个被移除的元素
splice 方法可以移除或替换已存在的元素或向原数组添加新元素,splice会改变原数组
如果要创建一个删除和/或替换部分内容而不改变原数组的新数组,请使用 toSpliced()。要访问数组的一部分而不修改它,参见 slice()
。
splice(start)
splice(start, deleteCount)
splice(start, deleteCount, item1)
splice(start, deleteCount, item1, item2, itemN)
start
从 0开始 ,表示要开始 改变数组的位置,如果传入小于0的数,代表从末尾 开始计算,
start < 0
,使用 start + array.length
如果 start < -array.length
,使用 0
如果 start >= array.length
,则不会删除任何元素
,但是该方法会表现为添加元素的函数,添加所提供的那些元素
。
如果 start 被省略了(即调用 splice() 时不传递参数),则不会删除任何元素。这与传递 undefined 不同,后者会被转换为 0。
deleteCount
一个整数,表示从start 开始,要删除的元素个数,
如果deletecount 不传或者大于 start 到数组末尾的个数
,则会删除从start开始直到末尾的所有元素
。
如果 deleteCount 是 0 或者负数
,则不会移除任何元素
。
item1, …, itemN
从 start 开始要加入到数组中的元素.
如果不指定元素,则表示删除元素
移除索引 2 之前的 0(零)个元素,并插入“drum”
const myFish = ["angel", "clown", "mandarin", "sturgeon"];
const removed = myFish.splice(2, 0, "drum");
// 运算后的 myFish 是 ["angel", "clown", "drum", "mandarin", "sturgeon"]
// removed 是 [],没有元素被删除
移除索引 2 之前的 0(零)个元素,并插入“drum”和“guitar”
const myFish = ["angel", "clown", "mandarin", "sturgeon"];
const removed = myFish.splice(2, 0, "drum", "guitar");
// 运算后的 myFish 是 ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"]
// removed 是 [],没有元素被删除
在索引 3 处移除 1 个元素
const myFish = ["angel", "clown", "drum", "mandarin", "sturgeon"];
const removed = myFish.splice(3, 1);
// 运算后的 myFish 是 ["angel", "clown", "drum", "sturgeon"]
// removed 是 ["mandarin"]
在索引 2 处移除 1 个元素,并插入“trumpet”
const myFish = ["angel", "clown", "drum", "sturgeon"];
const removed = myFish.splice(2, 1, "trumpet");
// 运算后的 myFish 是 ["angel", "clown", "trumpet", "sturgeon"]
// removed 是 ["drum"]
从索引 0 处移除 2 个元素,并插入“parrot”、“anemone”和“blue”
const myFish = ["angel", "clown", "trumpet", "sturgeon"];
const removed = myFish.splice(0, 2, "parrot", "anemone", "blue");
// 运算后的 myFish 是 ["parrot", "anemone", "blue", "trumpet", "sturgeon"]
// removed 是 ["angel", "clown"]
从索引 2 处开始移除 2 个元素
const myFish = ["parrot", "anemone", "blue", "trumpet", "sturgeon"];
const removed = myFish.splice(2, 2);
// 运算后的 myFish 是 ["parrot", "anemone", "sturgeon"]
// removed 是 ["blue", "trumpet"]
从索引 -2 处移除 1 个元素
const myFish = ["angel", "clown", "mandarin", "sturgeon"];
const removed = myFish.splice(-2, 1);
// 运算后的 myFish 是 ["angel", "clown", "sturgeon"]
// removed 是 ["mandarin"]
从索引 2 开始删除所有元素
const myFish = ["angel", "clown", "mandarin", "sturgeon"];
const removed = myFish.splice(2);
// 运算后的 myFish 是 ["angel", "clown"]
// removed 是 ["mandarin", "sturgeon"]
slice 用于得到原数组数组的切片对象,这个切片对象是由start 和end 决定原数组的浅拷贝
(包含start,不包含end,左闭右开
)数组。
这个切片数组的元素包含在原数组集合内,属于原数组的子集。
slice()
slice(start)
slice(start, end)
-数组长度
,或者省略了start,则默认为0 -数组长度
,则默认为0返回现有数组的一部分
const fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
const citrus = fruits.slice(1, 3);
// fruits 包含 ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
// citrus 包含 ['Orange','Lemon']
concat ()方法可以用于两个或者两个以上的数组进行合并,从而形成一个新的数组,这个方法不会改变原数组
concat()
concat(value0)
concat(value0, value1)
concat(value0, value1, /* … ,*/ valueN)
以下代码将三个数组合并为一个新数组:
const num1 = [1, 2, 3];
const num2 = [4, 5, 6];
const num3 = [7, 8, 9];
const numbers = num1.concat(num2, num3);
console.log(numbers);
// results in [1, 2, 3, 4, 5, 6, 7, 8, 9]
将值连接到数组
const letters = ["a", "b", "c"];
const alphaNumeric = letters.concat(1, [2, 3]);
console.log(alphaNumeric);
// results in ['a', 'b', 'c', 1, 2, 3]
合并嵌套数组
const num1 = [[1]];
const num2 = [2, [3]];
const numbers = num1.concat(num2);
console.log(numbers);
// [[1], 2, [3]]
// 修改 num1 的第一个元素
num1[0].push(4);
console.log(numbers);
// [[1, 4], 2, [3]]
join 方法可以将原数组的元素,以特定的分隔符,拼接起来,形成一个字符串,这个方法不会改变原数组
join()
join(separator)
使用用四种不同的方式连接数组
const a = ["Wind", "Water", "Fire"];
a.join(); // 'Wind,Water,Fire'
a.join(", "); // 'Wind, Water, Fire'
a.join(" + "); // 'Wind + Water + Fire'
a.join(""); // 'WindWaterFire'
split 方法与 join 是相反的,此方法可以将字符串的字符以特定的分隔符,切割成数组元素
split(separator)
split(separator, limit)
下例中,split() 方法会查找“0 或多个空白字符接着分号,再接着 0 或多个空白字符”模式的字符串,找到后,就将空白符和分号从字符串中移除,nameList 是 split 的返回数组。
const names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";
console.log(names);
const re = /\s*(?:;|$)\s*/;
const nameList = names.split(re);
console.log(nameList);
上例输出两行,第一行输出原始字符串,第二行输出结果数组。
Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
[ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]
数组还有很多方法,例如map、forEach 、some、等,会在接下来的文章继续为大家讲解。
一类是可以改变原数组
,另外一种是对原数组进行浅拷贝
,不会改变原数组浅拷贝拷贝的是引用值
,如果使用join,concat、slice得到的新数组,新数组中有数组或者对象,通过修改新数组的这些对象,原数组的对应的值也会改变。