目录
一、创建数组
new创建数组
// 创建一个数组
var arr = new Array();
// 1.使用typeof检查一个数组时,会返回Object
console.log(typeof arr); // Object
// 2.向数组添加元素 语法:数组[索引] = 值 索引从0开始
arr[0] = 10;
arr[1] = 21;
arr[2] = 32;
// arr[5] = 44;
console.log(arr); // [10, 21, 32]
// 3.读取数组中的元素 语法:数组[索引]
console.log(arr[1]); // 21 读取索引为1的位置
console.log(arr[3]); // 读取索引不存在的位置 会返回undefined
// 4.获取数组长度 语法:数组.length
console.log(arr.length); // 3
// 5.1对于连续的数组,使用length可以获取到数组的长度(元素继个数)
// 5.2对于非连续的数组,使用length会获取到数组的最大的索引+1
// 6.修改length
// 6.1如果修改的length大于原长度,则多出部分会空出来
// arr.lenght = 6;
// console.log(arr);
// 6.2如果修改的length小于原长度,则多出的元素会被删除
// arr.length = 2
// console.log(arr); [10, 21]
// 7.用length作为索引给数组的最后一个位置添加元素 语法:数组[数组.length]=元素
arr[arr.length] = 33;
arr[arr.length] = 44;
console.log(arr); // [10, 21, 32, 33, 44]
// 8.1使用构造函数创建数组时,也可以同时添加元素,将要添加的元素作为构造函数的参数传递,元素之间使用,隔开
var arr1 = new Array(1, 2, 3, 4, 5);
console.log(arr1); // [1, 2, 3, 4, 5]
// 8.2使用构造函数创建对象,如果里面只有一个元素n,代表创建了一个长度为n的数组
var arr2 = new Array(10);
console.log(arr2.length); // 10
字面量创建数组
// 1.字面量创建数组:直接在创建时就添加元素,数组中的元素可以是任意的数据类型
var arr = ['小莉', 2, 3, 4, true, {name: 'koko'}, function() {}];
console.log(arr); // ["小莉", 2, 3, 4, true, {…}, ƒ]
// 2.多维数组:数组里面放数组
var arr1 = [[1, 2, 3], [4, 5, 6], [7,8]];
console.log(arr1); // [Array(3), Array(3), Array(3)]
console.log(arr1[1][1]); // 5
二、数组的常用方法
常用方法 | 释义 | |||
push(); | 向数组的末尾添加一个或多个元素,并将数组新的长度作为返回值返回 | |||
pop(); | 删除数组的最后一个元素,并将被删除的元素作为返回值返回 | |||
unshift(); | 向数组开头添加一个或多个元素,并将数组新的长度作为返回值返回 | |||
shift(); | 删除数组的第一个元素,并将被删除的元素作为返回值返回 | |||
forEach() | 遍历数组,只支持IE8以上的浏览器 | |||
slice(); | 用来从数组提取指定元素,不会改变原来数组 | |||
splice(); | 删除/插入/替换元素,会影响到原数组 | |||
concat(); | 连接两个或多个数组,并将新的数组返回,不会对原数组产生影响 | |||
join(); | 将数组转换为一个字符串,将转换后的字符串作为结果返回,不会对原数组产生影响 | |||
reverse(); | 用来反转数组,会直接修改原数组 | |||
sort(); | 用来对数组中的元素进行排序,默认会按照Unicode编码进行排序 ,会影响原数组 |
1.push(); pop(); unshift(); shift();
// 创建一个数组
var arr = [1, 2, 3, 4];
// 1.push(); 该方法可以向数组的末尾添加一个或多个元素,并将数组新的长度作为返回值返回
var re = arr.push(23, 45);
console.log(arr); // [1, 2, 3, 4, 23, 45]
console.log(re); // 6
// 2.pop(); 该方法可以删除数组的最后一个元素,并将被删除的元素作为返回值返回
var res = arr.pop();
console.log(arr); // [1, 2, 3, 4, 23]
console.log(res); // 45
// 3.unshift(); 向数组开头添加一个或多个元素,并将数组新的长度作为返回值返回
// 向前边插入元素以后,其他的元素索引会依次调整
var resu = arr.unshift('玉兔', '白马');
console.log(arr); // ["玉兔", "白马", 1, 2, 3, 4, 23]
console.log(resu); // 7
// 4.arr.shift(); 可以删除数组的第一个元素,并将被删除的元素作为返回值返回
var result = arr.shift();
console.log(arr); // ["白马", 1, 2, 3, 4, 23]
console.log(result); // 玉兔
2.slice(); 可以用来从数组提取指定元素,该方法不会改变原来数组,而是将截取到的元素封装到一个新数组中返回.
参数:
(1)截取开始的位置的索引,包含开始索引
(2)截取结束的位置的索引,不包含结束索引
- 第二个参数可以省略不写,此时会截取从开始索引往后的所有元素
- 索引可以传递一个负值,如果传递一个负值,则从后往前计算
var arr = [1, 2, 3, 4, 5, 6];
var re = arr.slice(1, 3);
console.log(re); // [2, 3]
re = arr.slice(1, -1);
console.log(re); // [2, 3, 4, 5]
3.splice(); 删除/插入/替换元素,使用splice()会影响到原数组,会将指定元素从原数组中删除,并将被删除的元素作为返回值返回
参数:
(1)第一个,表示开始位置的索引
(2)第二个,表示删除的数量,
(3)第三个及以后,可以传递—些新的元素,这些元素将会自动插入到开始位置索引前边
// 1.删除元素
arr = [1, 2, 3, 4, 5, 6, 7];
re = arr.splice(1, 3);
console.log(arr); // [1, 5, 6, 7]
console.log(re); // [2, 3, 4]
// 2.替换元素
arr = [1, 2, 3, 4, 5, 6, 7];
arr.splice(1, 2, '八戒', '悟空');
console.log(arr); // [1, "八戒", "悟空", 4, 5, 6, 7]
// 3.插入元素:如果删除的数量为0,则在原来的基础上增加了元素
arr = [1, 2, 3, 4, 5, 6, 7];
arr.splice(1, 0, '和尚', '小红');
console.log(arr); // [1, "和尚", "小红", 2, 3, 4, 5, 6, 7]
4.concat()可以连接两个或多个数组,并将新的数组返回,该方法不会对原数组产生影响
var arr1 = ['悟空', '八戒', '和尚'];
var arr2 = ['lili', 'koko', 'nacy'];
var arr3 = ['山海经', '西游记', '水浒传'];
var arr = arr1.concat(arr2); // 连接两个数组
console.log(arr); // ["悟空", "八戒", "和尚", "lili", "koko", "nacy"]
var arr0 = arr1.concat(arr2, arr3, '牛魔王'); // 连接三个数组 不仅可以传数组 还可以传元素
console.log(arr0); // ["悟空", "八戒", "和尚", "lili", "koko", "nacy", "山海经", "西游记", "水浒传", "牛魔王"]
5.join(); 该方法可以将数组转换为一个字符串
- 该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
- 在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符,如果不指定连接符,则默认使用,作为连接符。
arr1 = ['悟空', '八戒', '和尚'];
var re = arr1.join(', ');
console.log(re); // 悟空, 八戒, 和尚
6.reverse(); 该方法用来反转数组,该方法会直接修改原数组
arr1 = ['悟空', '八戒', '和尚'];
arr1.reverse();
console.log(arr1); // ["和尚", "八戒", "悟空"]
7.sort(); 可以用来对数组中的元素进行排序,也会影响原数组,默认会按照Unicode编码进行排序
arr = [2, 1, 5, 3, 9];
arr.sort();
console.log(arr); // [1, 2, 3, 5, 9]
7.1即使对于纯数字的数组,使用sort()排序时,也会按照Unicode编码来排序,所以对数字进排序时,可能会得到错误的结果
arr = [2, 11, 5, 3, 9];
arr.sort();
console.log(arr); // [11, 2, 3, 5, 9]
7.2可以在sort()添加一个回调函数,来指定排序规则,回调函数中需要定义两个形参a, b,
- a-b:按从小到大的顺序
- b-a:按从大到小的顺序
arr = [2, 11, 5, 3, 9];
arr.sort(function(a, b) {
return a - b;
})
console.log(arr); // [2, 3, 5, 9, 11]
三、遍历数组
1.for循环遍历数组
var arr = [1, 3, 4, 5, 7, 6, 3];
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]); // 1, 3, 4, 5, 7, 6, 3
}
2.forEach()遍历数组
(1)该方法只支持IE8以上的浏览器
(2)该方法需要一个函数作为参数,像这种函数,由我们创建但是不由我们调用的,我们称为回调函数
(3)数组中有几个元素函数就会执行几次,每次执行时,浏览器会将遍历到的元素以实参的形式传递进来,我们可以来定义形参,来读取这些内容
(4)浏览器会在回调函数中传递三个参数:
- 第一个参数,就是当前正在遍历的元素
- 第二个参数,就是当前正在遍历的元素的索引
- 第三个参数,就是正在遍历的数组
var arr = [1, 2, 3, 4, 5, 6];
arr.forEach(function(value, index, obj) {
// console.log(value); 1 2 3 4 5 6
// console.log(index); 0 1 2 3 4 5
console.log(obj); // [1, 2, 3, 4, 5, 6]
})
【练习】数组去重
var arr = [1, 2, 3, 1, 4, 2, 2, 5, 6, 6, 7]; // 去重后:[1, 2, 3, 4, 5, 6, 7]
var newArr = [];
for (var i = 0; i < arr.length; i++) {
var n = arr[i];
if (newArr.indexOf(n) == -1) { // 判断数组中是否有某个元素 没有就返回-1
newArr.push(n);
}
}
console.log(newArr); // [1, 2, 3, 4, 5, 6, 7]
四、函数的call()、apply()和bind()
1.在调用call()、apply()和bind()时,可以将一个对象指定为一个参数,此时这个对象将会成为函数执行时的this,都是Funtion.prototype的方法。
2.call()、apply()和bind()的区别:
(1)call()方法将实参在对象之后依次传递
(2)apply()方法需要将实参封装到一个数组中统一传递
(3)和call()方法一样,将实参在对象之后依次传递,不同的是:需要返回函数
function fun(a, b) {
// console.log(this);
console.log('a = :' + a);
console.log('b = :' + b);
}
var obj1 = {
name: "obj1",
sing: function() {
console.log(this);
}
}
var obj2 = {
name: "obj2"
}
// fun.apply(obj1); {name: "obj1", sing: ƒ}
obj1.sing.apply(obj2) // {name: "obj2"}
// 1.call()方法可以将实参在对象之后依次传递
fun.call(obj1, 1, 2); // a = :1 b = :2
// 2.apply()方法需要将实参封装到一个数组中统一传递
fun.apply(obj1, [1, 2]); // a = :1 b = :2
// 3.bind()和call()一样,不同的是需要返回函数
fun.bind(obj1, 1, 2)(); // a = :1 b = :2
this的情况:
- 以函数形式调用时,this永远都是window
- 以方法的形式调用时,this是调用方法的对象
- 以构造函数的形式调用时,this是新创建的那个对象
- 使用call和apply调用时,this是指定的那个对象
五、arguments
1.arguments是一个类数组对象,它也可以通过索引来操作数据,也可以获取长度
2.在调用函数时,我们所传递的实参都会在arguments中保存
3.length表示函数形参个数,arguments.length表示函数传递实参的个数
4.我们即使不定义形参,也可以通过arguments来使用实参,只不过比较麻烦
5.它里边有一个属性叫做callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象
function fn() {
console.log(arguments.length);
console.log(arguments.callee == fn); // true
}
fn(1, 2, 3); // 3