声明数组的两种方式:
1. 构造函数的方式
var array obj = new Array(); 创建一个数组;
var arrayobj = new Array(size); 创建一个指定长度的数组;
2. 声明字面量的方式
var arr = [];
数组赋值注意事项:
数组里面能够存放任意类型的值,并且可以同时存放字符串以及数字,但这样会以后数组的调用造成隐患,所以数字最好按数据类型分类存放;
数组的索引
数组是有序的,数组中每一个元素都有一个索引,索引是从0开始的;
数组的长度
数组有一个
length属性,指代数组的长度,即数组中元素的个数;
数组遍历
for(var i = 0; i < arr.length;i++) {
console.log(arr[i]);
}
数组元素的添加
array.
push(); 将元素添加到数组结尾,返回数组长度;
array.
unshift(); 将元素添加到数组开始位置;
数组元素的删除:
array.
pop(); 移除数组中最后一个元素;
array.
shift(); 移除数组第一个元素;
array.
splice(1,2,"aa","bb");
值说明:
1.开始要删除的下标;
2.要移除的个数;
"aa","bb". 被删除的下标重新赋值;
数组的截取(浅复制,不影响原来的数组)
array.
slice(start,[end]);
数组的合并
array.
concat(item[item]);
数组的排序
array.
reverse(); 反转数组;
array.
sort(); 对数组元素进行排序;
查找数组元素出现位置
array.
indexof(); 查找元素第一次的位置下标;
array.
lastIndexof(); 查找元素最后一次出现的位置下标;如果有两个值,第二个参数表示从第几个下标开始查找;
稀疏数组
数组中存在未赋值的空位置;
数组方法
forEach();
遍历数组的每一个值与下标,依次传递给回调函数供其使用。 作用: 就是为了简化变化数组的过程。 语法: arr.forEach(function(val, i, arr){});
var arr = ['cba', 'nba', 'bbc', 'aac', 'ic']; // 普通方式遍历数组 for (var i = 0, len = arr.length; i < len; i++) { console.log(arr[i]); } // 通过forEach方法来遍历 arr.forEach(function(val) { console.log(val); });
map();
遍历数组的每一个值与下标,依次传递给回调; 然后接收回调函数返回结果,把这些结果组成一个新数组返回。 作用:为了通过一组数据映射成另外一组数据。 语法:arr.map(function(val, i, arr){return xxx});
var numArr = [1, 3, 5, 8, 10]; // 普通方式实现 var mapArr = []; for (var i = 0, len = numArr.length; i < len; i++) { mapArr.push(numArr[i] * 10); } console.log(mapArr); // 利用map方法,把arr中的所有值放大10倍 console.log(numArr.map(function (val) { return val * 10; }));
filter();
遍历数组的每一个值与下标,依次传递给回调; 如果回调函数执行的结果布尔值为true; 就会保留这个值,最终返回所有被保留的值组成的新数组; 作用:为了过滤那些不需要的数据; 语法:arr.filter(function(val, i, arr){return true})
var numArr = [1, 100, 50, 20, 33, 5, 73, 21]; // 大于50的留下,普通方式 var newArr = []; for (var i = 0, len = numArr.length; i < len; i++) { if (numArr[i] >= 50) { newArr.push(numArr[i]); } } console.log(newArr); // 大于50的留下,利用filter方法 console.log(numArr.filter(function (val) { return val >= 50; }));
some();
遍历数组的每一个值与下标,依次传递给回调, 如果回调中有一个返回true,那么some的结果就为true。 可以认为是||运算符。 some在遇到回调为true的时候,会终止剩余的迭代。 作用:判断一组数据是否含有符合某种规则的数据。 语法:arr.some(function(val, i, arr){return true})
var arr = [1, 'str', function(){}, null, 43, 'nba']; // 判断数组中是否含有字符串类型的数据 var has = false; for (var i = 0, len = arr.length; i < len; i++) { if (typeof arr[i] === 'string') { has = true; break; } } console.log(has); // 使用some完成 console.log(arr.some(function (val) { // 当some遍历到第二个值的时候,我们返回的true,some就会终止遍历 //console.log(arguments); if (typeof val === 'string') { return true; } }));
var arr = [10, 8, 34, 67, 345, 76]; // 遍历数组,如果遇到奇数,那么终止遍历,否则打印其值 arr.some(function(val){ // 遇到奇数,返回true,告诉some终止遍历 if (val % 2 !== 0) { return true; } console.log(val); });
every();
遍历数组的每一个值与下标,依次传递给回调, 如果所有的回调中都返回true,那么every的结果才为true。 可以认为是&&运算符。 every在遇到回调为false的时候,会终止剩余的迭代。 作用:判断一组数据是否全部符合某种规则的数据。 语法:arr.every(function(val, i, arr){return true});
var arr = [1, 2, 4, 'ds', Function]; // 判断数组中的数据是否全部为数值 console.log(arr.every(function (val) { // 如果为number,返回true; // 否则利用函数的默认返回值返回undefined(相当于是false) if (typeof val === 'number') { return true; } }));
var arr = [10, 8, 34, 67, 345, 76]; // 遍历数组,如果遇到奇数,那么终止遍历,否则打印其值 arr.every(function(val){ // 遇到偶数,返回true,告诉every继续遍历吧 if (val % 2 === 0) { console.log(val); return true; } });
join()
将所有元素转换为字符串拼接在一起,返回生成的字符串,如果不指定分隔符,默认使用逗号;
join() 方法是split() 方法的逆向操作, 后者是将字符串分割成若干块来创建一个数组;
var a = [1, 2, 3]; a.join(); // '1, 2, 3' a.join(' '); // '1 2 3' a.join(''); // '123'
reverse()
将数组在原数组的基础上对元素逆向排序,不产生新的数组;
var a = [1,2,3]; console.log(a.reverse()); //3,2,1
sort()
将数组中的元素排序并返回排序后的数组,当不带参数调用时, 数组元素已字母顺序表排序;
如果数组包含underfind元素, 它们会被排到数组的尾部;
var a = ['a','c','b']; console.log(a.sort()); // a,b,c
如果需要按照其他方式来排序, 需要给sort()方法传递一个比较函数;
var a = [33, 4, 11, 22]; a.sort(); // 11,22,33,4 a.sort(function (a, b) { return a - b; // 根据顺序,返回负数>0>正数 }); a.sort(function (a, b) { return b - a; })
//将字符串数组按照字符长度从小到大排列 var arr = ["a", "bsdfdsfb", "cccd", "ddd"]; arr.sort(function (a, b) { return b.length - a.length; }); console.log(arr);
concat()
创建并返回新的数组, 他的元素包含调用concat()的原始数组的元素和coancat()的每一个参数;
var a = [1,2,3] a.concat(4,5); // 1,2,3,4,5 a.concat([4,5]); // 1,2,3,4,5 a.concat([4,5],[6,7]); // 1,2,3,4,5,6,7 a.concat(4,[5,[6,7]]); // 1,2,3,4,5,[6,7]
slice()
返回指定数组的一个片段或子数组.他的两个参数分别指定了开始和结束的位置(包头不包尾);
如果只有一个参数, 返回的数组将包含从开始位置到数组结尾的所有元素;
如果参数是负数, 它表示相对于数组最后一个元素的位置,如-1 表示最后一个元素;
toString()
将数组转化为字符串;
给数组的原型添加方法
这里以给数组添加一个计算数组长度的方法为例:
Array.prototype.conLength = function(){
console.log(this.length);
}
var arr = [];
arr.push(1,4,7);
arr.conLength();
结果为数组传入值个数:3;
判断真伪数组
function isArrayLike(arrayLike) { /* * 1、判断是不是对象,不是直接返回false * 2、是function或者window,也直接返回false * 3、再判断是不是真数组,是返回true * 4、不是真数组继续判断 * 4.1、判断对象的length是不是为0,是返回true * 4.2、判断length是不是number类型,而且>0,同时还需要拥有length - 1这个属性,满足返回true。 * 5、默认返回false。 * */ // function、window、非对象直接返回false if(typeof arrayLike !== 'object' || arrayLike === null || typeof arrayLike === 'function' || arrayLike === window ) { return false } // 是真数组返回true if({}.toString.call(arrayLike) === '[object Array]') { return true; } // 是伪数组返回true return arrayLike.length === 0 || (typeof arrayLike.length === 'number' && arrayLike.length > 0 && (arrayLike.length - 1) in arrayLike); return false; }