数组的声明和读写
-
数组字面量声明
var arr = [1, 2, 3, 4]; 复制代码
-
构造函数声明
var arr = new Array(1, 2, 3); 复制代码
-
类型转换声明
var arr = Array(1, 2, 3); 复制代码
所有数组都继承于 Array.prototype
如果只给构造函数一个参数 num,则是声明一个长度为 num 的数组,内容都为 empty,即 undefined
-
稀松数组
var arr = [, 2, , 4,]; console.log(arr); // empty, 2, empty, 4 复制代码
数组字面量可以定义稀松数组,打印数组未给值处打印出 empty,实际上是 undefined,需要注意最后一个 “,” 不算
-
数组基于对象的键值对
var arr = [1, 2, 3, 4, 5]; var obj = { 0: 1, 1: 2, 2: 3, 3: 4 }; 复制代码
Array 重写了 Object 的 toString 方法
-
数组的读写
使用下标(索引),读对应位置的数据,没有则返回 undefined
var arr = [, 2, , 4,]; arr[0] = 1; 复制代码
push() 和 unshift()
push、unshift 方法继承自 Array.prototype
push 在数组最后一位后添加一位,unshift 在第一位前添加一位
参数为要添加的内容,可以是多个
返回数组添加后的长度
var arr = [1, 2, 3];
arr.push(4, 5);
arr.unshift(0);
console.log(arr);
// [0, 1, 2, 3, 4, 5]
复制代码
pop() 和 shift()
pop、shift 方法继承自 Array.prototype
pop 删除数组最后,shift 删除第一位
返回被删除的数值
var arr = [1, 2, 3];
console.log(arr.pop());
console.log(arr);
console.log(arr.shift());
console.log(arr);
// 3
// 1, 2
// 1
// 2
复制代码
reverse()
reverse 方法继承自 Array.prototype
颠倒原数组内容并返回颠倒后的数组
var arr = [1, 2, 3];console.log(arr.reverse());// [3, 2, 1]
复制代码
splice()
splice 方法继承自 Array.prototype
剪切数组中内容,可以剪切位置添加数据,会影响原数组
参数:开始的下标,剪切的长度,在开始下标位置添加的数据
返回剪切下的子数组
var arr = [1, 2, 3];console.log(arr.splice(1));console.log(arr);// [2, 3]// [1]
复制代码
只给第一个参数,剪切从开始下标到最后的所有数据
如果是负数,则从 -1 开始由后往前数
var arr = [1, 2, 3];console.log(arr.splice(1, 1));console.log(arr);// [2]// [1, 3]
复制代码
给两个参数,代表开始下标和剪切长度
var arr = [1, 2, 3];console.log(arr.splice(1, 1, 100, 101));console.log(arr);// [2]// [1, 100 ,101, 3]
复制代码
给三个参数,剪切后在开始下标位置后添加数据
slice()
和 splice() 功能相似,复制数组中内容并返回,但是不会影响到原数组
参数:开始下标,结束下标,不包括结束下标,左闭右开
var arr = [1, 2, 3];console.log(arr.slice(0, 2));console.log(arr);// [1, 2]// [1, 2, 3]
复制代码
sort()
sort 方法用于数组排序,继承自 Array.prototype
默认按照 ASCII 码进行排序
改变原数组内容并返回排序以后的数组
```javascriptvar arr = [1, 4, 2, 3, 30];console.log(arr.sort());// [1, 2, 3, 30, 4]```
复制代码
sort 方法给一个函数 function(a, b){},如果返回正数,则将 a 排在 b 后,否则 a 排在 b 前
var arr = [1, 3, 14, 27, 5, 4];console.log(arr.sort(function(a, b) { return a - b;}));// [1, 3, 4, 5, 14, 27]
复制代码
利用 Math.random() 返回 (0, 1) 之间的随机数结合 sort 方法实现数组随机排序
因为 Math.random() – 0.5 返回一个 (-0.5, 0.5) 之间的随机数
var arr = [1, 2, 3, 4, 5, 6];console.log(arr.sort(function(a, b) { return Math.random() - 0.5;}));
复制代码
concat()
用于连接两个数组,返回拼接后的数组,参数为要在后面拼接的数组
var arr1 = [1, 2, 3];var arr2 = [4, 5, 6];console.log(arr1.concat(arr2));// [1, 2, 3, 4, 5, 6]
复制代码
toSting()
将数组转换成字符串,返回该字符串,用逗号分隔
var arr = [1, 2, 3];console.log(arr.toString());
复制代码
jion() 和 split()
-
jion 方法将数组转换成字符串,返回该字符串,参数作为分隔符
-
split() 方法将字符串装换成数组,返回该数组第一个参数作为分隔符,第二个参数表示返回前几位,不给则全部返回
var arr = [1, 2, 3];str = arr.join('-');console.log(str);console.log(str.split('-'));console.log(str.split('-', 2));// 1-2-3// [1, 2, 3]// [1, 2] 复制代码
filter()
兼容 IE9 及以上
用于对数组内容进行过滤,参数方法返回值决定对应元素的去留,若返回 false 则剔除该元素
// 数组去重示例var arr = [0, 1, 2, 2, 3, 4, 4, 0, 1];funtion uniqe(arr) { return arr.filter(function(item, index, arr) { //当前元素在数组中的第一个索引 === 当前索引值,则该元素没有重复 return arr.indexOf(item) === index; });}// 方法缺陷:不能去除 [{}, {}]
复制代码
类数组
-
类数组是是一种类似数组,如 arguments、NodeList 等,它们有 length 属性,甚至有 forEach 属性
-
类数组没有继承 Array.prototype,没有 push、splice 等方法
-
类数组和数组的底层都是基于对象的键值对
-
不支持数组方法的类数组,可以通过借用 Array.prototype 实现操作
var obj = { 2: 3, 3: 4, length: 2, push: Array.prototype.push}obj.push(1);obj.push(2);console.log(obj);// {// 2: 1,// 3: 2,// length: 4,// push: push(){}// __poroto__: {...}// } 复制代码
对于这是道题,首先我们要明白数组的 push 方法继承于 Array.prototype,其次要了解 push 方法的内部过程,即在 length 位置存数据,然后 length 加一
Array.prototype.push = function (elem) { this[this.length++] = elem;} 复制代码