***数组是特殊类型的对象
对数组使用typeof会返回object 所以识别数组不使用这种方法 使用
Array.isArray(car);
数组和对象的区别
在 JavaScript 中,数组使用数字索引。
在 JavaScript 中,对象使用命名索引。
数组是特殊类型的对象,具有数字索引。***
首先JS的数组不能通过==
或===来比较两个数组是否完全一样
如果要比较两个数组是否完全一样,需要把数组转化为字符串
如:
s1.toString()==s2.toString();
s1.toString===s2.toString;
或者
stack1.join("")==stack2.join("")
stack1.join("")===stack2.join("")
如果想要比较两个数组的元素是否相同,但顺序可以不一致,可以先对数组进行排序,再对排序后的数组转化为字符串比较
s1.sort.toString()==s2.sort.toString()
1.数组的创建
var cars = ["Saab", "Volvo", "BMW"];
或
var cars = new Array("Saab", "Volvo", "BMW");
2.访问数组
可以通过索引号来访问数组,也可以通过数组名来访问完整的数组
document.getElementById("demo").innerHTML = cars[0];
document.getElementById("demo").innerHTML = cars;
3.数组长度 length
car.length
4.push与pop(类似于栈)
push方法返回的是字符串的长度,pop方法返回的是被弹出的数
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.push("Lemon"); // 向 fruits 添加一个新元素 (Lemon)
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.pop(); // x 的值是 "Mango"
5.shift()和unshift()
shift位移与弹出等同,但处理首个元素而不是最后一个。
shift() 方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.shift(); // 从 fruits 删除第一个元素 "Banana"并返回该元素
unshift() 方法(在开头)向数组添加新元素,并“反向位移”旧元素:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon"); // 向 fruits 添加新元素 "Lemon"并返回新字符串的长度
6.delete删除方法
var fruits = ["Banana", "Orange", "Apple", "Mango"];
delete fruits[0]; // 把 fruits 中的首个元素改为 undefined
使用 delete 会在数组留下未定义的空洞。请使用 pop() 或 shift() 取而代之。
7.splice()方法
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 2, "Lemon", "Kiwi");
第一个参数(2)定义了应添加新元素的位置(拼接)。
第二个参数(2)定义应删除多少元素。
其余参数(“Lemon”,“Kiwi”)定义要添加的新元素。
splice() 方法返回一个包含已删除项的数组:
原数组:
Banana,Orange,Apple,Mango
新数组:
Banana,Orange,Lemon,Kiwi
已删除项:
Apple,Mango
8.合并(连接)数组
concat() 方法通过合并(连接)现有数组来创建一个新数组:
var arr1 = ["Cecilie", "Lone"];
var arr2 = ["Emil", "Tobias", "Linus"];
var arr3 = ["Robin", "Morgan"];
var myChildren = arr1.concat(arr2, arr3); // 将arr1、arr2 与 arr3 连接在一起
concat() 方法不会更改现有数组。它总是返回一个新数组。
concat() 方法可以使用任意数量的数组参数。
9.裁剪数组
slice() 方法用数组的某个片段切出新数组。
slice() 可接受两个参数,比如 (1, 3)。
该方法会从开始参数选取元素,直到结束参数(不包括)为止。
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);
结果是:Orange,Lemon
如果结束参数被省略,比如第一个例子,则 slice() 会切出数组的剩余部分
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(2);
结果是
Lemon,Apple,Mango
var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.toString();
结果是Banana,Orange,Apple,Mango
10.把数组转换为字符串
JavaScript 方法 toString() 把数组转换为数组值(逗号分隔)的字符串。
join() 方法也可将所有数组元素结合为一个字符串。它的行为类似 toString(),但是您还可以规定分隔符:
var fruits = ["Banana", "Orange","Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.join(" * ");
结果是Banana * Orange * Apple * Mango
11.数组排序
sort() 方法以字母顺序对数组进行排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // 对 fruits 中的元素进行排序
Apple,Banana,Mango,Orange
12.反转数组
reverse() 方法反转数组中的元素。
您可以使用它以降序对数组进行排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // 对 fruits 中的元素进行排序
fruits.reverse(); // 反转元素顺序
Orange,Mango,Banana,Apple
13.数字排序
默认地,sort() 函数按照字符串顺序对值进行排序。该函数很适合字符串(“Apple” 会排在 “Banana” 之前)。不过,如果数字按照字符串来排序,则 “25” 大于 “100”,因为 “2” 大于 “1”。正因如此,sort() 方法在对数值排序时会产生不正确的结果。我们通过一个比值函数来修正此问题:
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
1,5,10,25,40,100
使用相同的技巧对数组进行降序排序:
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
100,40,25,10,5,1
14.以随机顺序排序数组
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});
15.对数组使用 Math.max()
您可以使用 Math.max.apply 来查找数组中的最高值:
function myArrayMax(arr) {
return Math.max.apply(null, arr);
}
Math.max.apply([1, 2, 3]) 等于 Math.max(1, 2, 3)。
function myArrayMin(arr) {
return Math.min.apply(null, arr);
}
Math.min.apply([1, 2, 3]) 等于 Math.min(1, 2, 3)。
15.排序对象数组
var cars = [
{type:"Volvo", year:2016},
{type:"Saab", year:2001},
{type:"BMW", year:2010}];
cars.sort(function(a, b){return a.year - b.year});
比较字符串属性会稍复杂:
cars.sort(function(a, b){
var x = a.type.toLowerCase();
var y = b.type.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
16.数组的遍历
Array.forEach()
forEach() 方法为每个数组元素调用一次函数(回调函数)。
var txt = "";
var numbers = [45, 4, 9, 16, 25];
numbers.forEach(myFunction);
function myFunction(value, index, array) {
txt = txt + value + "<br>";
}
注释:该函数接受 3 个参数:
项目值
项目索引
数组本身
所有浏览器都支持 Array.forEach(),除了 Internet Explorer 8 或更早的版本
17.Array.map()
map() 方法通过对每个数组元素执行函数来创建新数组。
map() 方法不会对没有值的数组元素执行函数。
map() 方法不会更改原始数组。
这个例子将每个数组值乘以2:
var numbers1 = [45, 4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);
function myFunction(value, index, array) {
return value * 2;
}
请注意,该函数有 3 个参数:
项目值
项目索引
数组本身
所有浏览器都支持 Array.map(),除了 Internet Explorer 8 或更早的版本
18.Array.filter()
filter() 方法创建一个包含通过测试的数组元素的新数组。
这个例子用值大于 18 的元素创建一个新数组:
var numbers = [45, 4, 9, 16, 25];
var over18 = numbers.filter(myFunction);
function myFunction(value, index, array) {
return value > 18;
}
所有浏览器都支持 Array.filter(),除了 Internet Explorer 8 或更早的版本
19.reduce() 方法在每个数组元素上运行函数,以生成(减少它)单个值。
reduce() 方法在数组中从左到右工作。另请参见 reduceRight()。
reduce() 方法不会减少原始数组。
这个例子确定数组中所有数字的总和:
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);
function myFunction(total, value, index, array) {
return total + value;
}
结果:99
请注意此函数接受 4 个参数:
总数(初始值/先前返回的值)
项目值
项目索引
数组本身
reduce() 方法能够接受一个初始值:
var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction, 100);
function myFunction(total, value) {
return total + value;
}
结果是:199