1.数组的创建
将一组无序的内容放在一个有序的列表中,这就是数组 。
不关心名称,只关心值和顺序,是引用型数据
-
创建方式——一维数组
- 字面量方式
var arr = []; var arr1 = [1,2,3,4] //[1,2,3,4] arr[1] = 100; //将数组的下标(索引值)为1设为100;下标是数值 obj["1"] = 100; //对象中的1是字符串,键值是100
- 构造函数创建
var arr2 = new Array(); //构造函数调用方式:new + 构造函数() var arr3 = new Array(1,2,3,4); //[1,2,3,4] // 区别: var arr11 = [10]; //length:1,其中第一项为10 var arr22 = new Array(10); //length:10,其中每一项都为empty
如果设置下标为非正整数,这个下标作为对象的键值对存储在数组中,他会变成数组的属性存储,而不是下标。
var arr = [1, 2, 3] arr[-1] = 4 console.log(arr)//[ 1, 2, 3, '-1': 4 ]
- 对象构造函数创建
var arr = new Object([]);
-
二维数组的创建
- 直接赋值
var arr=[ [1,2,3,4,5], [1,2,3,4,5], [2,3,4,5,7], ]
- 循环赋值
var arr=[]; for(var i=0;i<10;i++){ arr[i]=[]; for(var j=0;j<10;j++){ arr[i][j]=i*10+j; } } console.log(arr[5][6]);
2.数组的属性
-
数组的长度
数组之中的属性都是可以更改的
数组的长度等于最大下标+1。
var arr = []; arr.length = 10; //arr.length随着数组的长度而改变,此时的length为10 console.log(arr);
-
清空数组
表示数组的元素全部清除掉,数组本身还存; 数组元素是对象的情况下,建议先将数组的所有元素设为null,再清空数组
arr.length = 0;
-
删除数组
var arr = []; arr[0] = 1; arr[10] = "hello"; //删除数组的第一项 arr[0] = undefined; console.log(arr); //[undefined, empty × 9, "hello"] //彻底删除某一项 delete arr[0]; // [empty × 10, "hello"] //清空 arr.length = 0;
-
自动补位——特殊的赋值
var arr = []; arr[10] = "hello" console.log(arr); //[empty × 10, "hello"]
3. 数组项的遍历
-
累加数组中的项
var arr = [1, 2, 3, 4]; var s = (function (s, n) { if (!arr[n]) return s; s += arr[n]; return arguments.callee(s, n + 1); })(0, 0); console.log(s); //10
-
循环清空数组
var arr = [1, 2, 3, 4]; for(;--arr.length;); //或 var len = arr.length; for (var i = 0; i < len; i++) { arr.length--; }
-
错误写法一
//for(;arr.length--;); //减到最后一个元素的时候,会报错
错误写法二
如果在循环过程中改变了数组的长度,那么数组长度就不能再循环中作为条件使用
for(var i = 0; i < arr.length; i++){ arr.length --; }
-
-
查询遍历数组
for循环,下标是数值型;而for in循环,下标是字符型。
如果数组有可枚举属性时,for不可以遍历,而for in可以遍历
- for循环遍历
for循环可以遍历出
undefined
的元素,而for in不可以;
var arr = [1,null,2,,3]; //2和3之间是undefined
arr.a = 10;
for(var i = 0; i < arr.length; i++){
console.log(i, arr[i]);
}
//0 1
//1 null
//2 2
//3 undefined
//4 3
- for in循环遍历
for in循环只遍历属性名和值都存在的
另:for in 可以遍历可枚举属性
var arr = [1,null,2,,3];
arr.a = 10;
for(var index in arr){
console.log(index, arr[index]);
}
// 0 1
// 1 null
// 2 2
// 4 3
// a 10
4. 数组的内置API
-
push方法
将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
var animals = ['pigs', 'goats', 'sheep']; console.log(animals.push('cows')); // 4 console.log(animals); // Array ["pigs", "goats", "sheep", "cows"] var a1 = [['1', '2'],['3', '4']]; var a2 = a1[0]; console.log(a2.push(a1[1])); //3(返回新数组的长度) console.log(a2); //["1", "2", Array(2)]
-
unshift()方法
将一个或多个元素添加到数组的开头,并返回该数组的新长度
该方法修改原有数组。
var array1 = [1, 2, 3]; console.log(array1.unshift(4, 5)); // 5 console.log(array1);// Array [4, 5, 1, 2, 3] var a1 = [['1', '2'], ['3', '4']]; var a2 = a1[1]; console.log(a2.unshift(a1[0])); //3 console.log(a2); //[Array(2), "3", "4"]
-
pop方法
从数组中删除最后一个元素,并返回该元素的值。
此方法更改数组的长度。
var plants = ['broccoli', 'cauliflower', 'cabbage', 'kale', 'tomato']; console.log(plants.pop()); //"tomato" console.log(plants); // Array ["broccoli", "cauliflower", "cabbage", "kale"]
- 用pop从尾部删除并打印数组
var arr = [1, 3, 5, 0, 7, 2, 4]; var item; while((item = arr.pop) || item === 0){ console.log(item); //[4,2,7,0,5,3,1] }
-
shift方法
从数组中删除第一个元素,并返回该元素的值。
此方法更改数组的长度。 (从头部删除数组元素,效率是较低的)
var array1 = [1, 2, 3]; var firstElement = array1.shift(); console.log(array1); // Array [2, 3] console.log(firstElement); // 1
-
concat 数组的拼接
concat() 方法用于连接两个或多个数组,此方法不修改原数组。
var a = [1,2,3]; console.log(a.concat(4,5)); //[1,2,3,4,5] var a1 = [ ['1', '2'], ['3', '4'] ]; var a2 = a1[0]; console.log(a2.concat(a1[1])); console.log(a2); //Array["1", "2", "3", "4"] //Array["1", "2"]
-
join方法
将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项,那么将返回该项而不使用分隔符。
var elements = ['Fire', 'Air', 'Water']; console.log(elements.join()); //"Fire,Air,Water" console.log(elements.join('')); //"FireAirWater" console.log(elements.join('-')); //"Fire-Air-Water" //封装一个将数组转为字符串,并用符号进行分隔 var arr = [12, 3, 45, 5, 3]; function join(arr, symbol) { symbol === undefined ? symbol = "," : ""; //原料 var res = ""; for (var i = 0; i < arr.length; i++) { res += (i !== 0 ? symbol : "") + arr[i]; } return res; } console.log(join(arr, "%"));
-
slice()方法
返回一个新的数组对象,这一对象是一个由
begin
和end
决定的原数组的浅拷贝(包括begin
,不包括end
)。原始数组不会被改变。
var animals = ['ant', 'bison', 'camel', 'duck', 'elephant']; console.log(animals.slice(2)); // expected output: Array ["camel", "duck", "elephant"] console.log(animals.slice(2, 4)); // expected output: Array ["camel", "duck"] console.log(animals.slice(1, 5)); // expected output: Array ["bison", "camel", "duck", "elephant"] console.log(animals) //['ant', 'bison', 'camel', 'duck', 'elephant'] var arr = [1, 2, 3, 4, 5, 6, 7, 8]; console.log(arr.slice(1)); //[8] console.log(arr.slice(-1, -4)); //[],起点比终点还大,-1到-4之间没有交叉
-
splice()方法
删除或替换现有元素或者原地添加新的元素来修改数组,并以新数组形式返回被修改的内容。
此方法会改变原数组。
array.splice(start[, deleteCount[, item1[, item2[, ...]]]]) //开始的位置,删除元素的个数,要添加的元素
start
指定修改的开始位置(从0计数)。如果超出了数组的长度,则从数组末尾开始添加内容;
如果是负值,则表示从数组末位开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于
array.length-n
);如果负数的绝对值大于数组的长度,则表示开始位置为第0位。var months = ['Jan', 'March', 'April', 'June']; var newMonths = months.splice(0);////从头删除到尾部,意味着将原数组的元素剪切到新数组中 console.log(months,newMonths); //[] ["Jan", "March", "April", "June"] var months = ['Jan', 'March', 'April', 'June']; var newMonths = months.splice(); console.log(months,newMonths); //["Jan", "March", "April", "June"] [] var months = ['Jan', 'March', 'April', 'June']; months.splice(1, 0, 'Feb'); // 在第一位后插入了一个'Feb' console.log(months); //['Jan', 'Feb', 'March', 'April', 'June'] var arr=[1,3,5,0,7,2,4]; var arr1=arr.splice(arr.length,0,10,11); //var arr1=arr.splice(arr.length+2,0,10,11); //效果和上一行一致 console.log(arr); //[1, 3, 5, 0, 7, 2, 4, 10, 11] console.log(arr1); //[] var arr=[1,3,5,0,7,2,4]; var arr1=arr.splice(-3,3,10,11); console.log(arr); // [1, 3, 5, 0, 10, 11] console.log(arr1); //[7, 2, 4]
deleteCount
可选整数,表示要移除的数组元素的个数。如果
deleteCount
大于start
之后的元素的总数,则从start
后面的元素都将被删除(含第start
位)。如果
deleteCount
被省略了,或者它的值大于等于array.length - start
(也就是说,如果它大于或者等于start
之后的所有元素的数量),那么start
之后数组的所有元素都会被删除。如果
deleteCount
是 0 或者负数,则不移除元素。这种情况下,至少应添加一个新元素。var months = ['Jan', 'March', 'April', 'June']; months.splice(1, 10, 'May'); //从第一位开始,先删除10个元素,再添加'May' console.log(months); // ['Jan', 'May'] var months = ['Jan', 'March', 'April', 'June']; months.splice(1); console.log(months); // ['Jan'] var months = ['Jan', 'April', 'June']; var newMonth = months.splice(1,0,'Feb', 'March'); console.log(months); //["Jan", "Feb", "March", "April", "June"] //在第二位插入了10,原第二位向后挪动,因为没有删除元素,所以返回一个空数组 console.log(newMonth);
item1, item2, *...*
可选要添加进数组的元素,从
start
位置开始。如果不指定,则splice()
将只删除数组元素。var months = ['Jan', 'March', 'April', 'June']; months.splice(1, 10, 'May'); console.log(months); // ['Jan', 'May'] var months = ['Jan', 'March', 'April', 'June']; var newMonths = months.splice(-2); //没有填写要删除元素的个数,意味着从倒数第二个开始不,删除到尾部 console.log(months); // ["Jan", "March"] console.log(newMonths); //["April", "June"] var arr = [1, 3, 5, 0, 7, 2, 4]; var arr1=arr.splice(2,2); //从第二个后面开始,删除两个元素,并放入返回的新数组中 console.log(arr,arr1); //[1, 3, 7, 2, 4] (2) [5, 0]
- 删除数组中为奇数的元素
var arr = [1, 3, 5, 0, 7, 2, 4]; var len = arr.length; for(var i = 0; i < len;){ if(arr[i] % 2 === 1){ arr.splice(i,1); continue } i++; } console.log(arr); //[0, 2, 4] var arr = [1, 3, 5, 0, 7, 2, 4]; var arr1 = []; for(var i = 0; i < arr.length; i++){ if(arr[i] % 2 !== 1){ arr1.push(arr[i]); } } arr = arr1; console.log(arr); //[0, 2, 4]
-
sort()方法
用就地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的
var months = ['March', 'Jan', 'Feb', 'Dec']; months.sort(); console.log(months); // expected output: Array ["Dec", "Feb", "Jan", "March"] var array1 = [1, 30, 4, 21, 100000]; array1.sort(); console.log(array1); // expected output: Array [1, 100000, 21, 30, 4]
6.其他常用API介绍
- 判断一个元素是否为数组的三种方法
list[i][j] instanceof Array
//或
Array.isArray(list[i][j])
//或
arr.constructor === Array
- Math
Math.max(12,19,20); //20,可以接收任意个参数,并返回参数中最大的一个
- parseInt(string,进制)
parseInt(string, radix) string为字符串,radix为介于2-36之间的数。使用者告诉这个函数string(比如11)是radix(比如2)进制的,函数将固定返回string以十进制时显示的数(3)。
console.log(parseInt(' 0xFf', 16)); //255,n(2,36)进制转换为10进制
console.log(parseInt('1110', 2)); //14
- toString()
var num = 123;
num.toString(16); //7b, 10进制转换成n(2~36)进制
- instanceof
console.log([] instanceof Array); //true
console.log({} instanceof Array); //false
console.log([] instanceof Object); //true
console.log(function(){} instanceof Ojbect); //true
console.log(typeof function(){});
console.log("a" instanceof Object); //false
- arr.length
arr.length //得到数组的长度
- toFixed()
var num = 123.789;
num.toFixed(2) //123.79 方法可把 Number 四舍五入为指定小数位数的数字
- substring()
"abcdefg".substring(2,4) //cd
- padStart()
用另一个字符串填充当前字符串(重复,如果需要的话) ,以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用的。
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foow"); //"foowfooabc"
"#" + parseInt(parseInt("FFFFFF", 16) * Math.random()).toString(16).padStart(6, 0);
//产生16进制随机颜色
- 求随机数
5-10之间的随机数
5 + Math.round(Math.random() * 5);
//总结如下规律
min - max之间的随机数
min + Math.floor(Math.random() * (max - min + 1));