- 数组
两种构造方法
- Var arr = []; [1,2,3] 里面写数组的
- var arr = new Array(); new Array(10) 里面是数组长度。只能整数
- 溢出读写
var arr = [];
arr[10]; 结果为undefined
arr[10] = 123; 会将数组撑大到11位,[undefined x 10 , 123]
length为11
// 两种构造方法
var arr = []; //[1,2,3] 里面写数组的
var arr = new Array(); //new Array(10) 里面是数组长度。只能整数
// 溢出读写
var arr = [];
arr[10]; //结果为undefined
arr[10] = 123;//会将数组撑大到11位,[undefined x 10 , 123] length为11
1、数组的方法
1.1 push 在数组最后一位添加 可添加多位 返回数组长度
// 数组的方法
// 1、push 在数组最后一位添加 可添加多位
var arr = [];
arr.push(1,2,3);
// 试着自己在数组原型上写一个自己的push方法
Array.prototype.push = function(){
// 由于可以添加多个,所以不需要形参。只要实参
for (var i = 0; i < arguments.length; i++) {
this[this.length] = arguments[i]
}
return '我自己的push';
}
1.2 pop 剪切数组最后一位 传参无效 一次只剪切一位
// 2、pop 剪切数组最后一位 不传参 一次只删除一位
var arr = [1,2,3];
arr.pop(); //返回剪切的那个值 3
// arr原数组变成剪切后的新数组 [1,2]
1.3 unshift 在数组前面一位添加值 多添加多个
var arr = [1,2,3];
arr.unshift(1,2);//返回最后的数组长度 这里是5
自己试着封装一个unshift函数
1.4 shift 剪切数组最前面一位 不传参
var arr = [1,2,3];
arr.shift();//返回被剪切的那个值1
// 原本的数组保留剩下的值[2,3]
1.5 reverse 反转数组
var arr = [1,2,3,4,5];
arr.reverse(); //返回新的排列顺序[5,4,3,2,1]
1.6 splice 截取,添加,替换
arr.splice(从第几位开始,截取多少位,在切口处添加新数据)
// 6、splice 截取,添加,替换
// arr.splice(从第几位开始,截取多少位,在切口处添加新数据)
var arr = [1,2,3,4,5];
// 1、从索引1开始,截取2位
arr.splice(1,2);//返回截取的值[2,3]
// 原数组保留剩下的[1,4,5];
var arr = [1,2,3,4,5];
// 2、从索引1开始截取2位,插入新值8,8,8
arr.splice(1,2,8,8,8);//返回截取的[2,3]
// 原数组保留剩下的[1,8,8,8,4,5]
var arr = [1,2,3,4,5];
// 3、不想截取,只想在索引3的位置添加值8
arr.splice(3,0,8);//在哪位加就从哪位开始,截取0
// 注意:如果是负数位开始,就是倒数位 但只截取最后一位。
// 当是-1开始时,不管第二个参数是几,都只截取一位。
var arr = [1,2,3,4,5];
arr.splice(-1,3);//只截取之后一位[5]
arr.splice(-2,2);//从倒数第二位往前截取;两位
1.7 sort 将数组按大小排列
arr.sort();将数组内每一项按编码大小排列。,而不是数字大小
arr.sort(function(a,b){return a-b});//里面必须传两个参数
// 7、sort 将数组按大小排列
// arr.sort();将数组内每一项按编码大小排列。,而不是数字大小
arr.sort(function(a,b){return a-b});//里面盲必须传两个参数
var arr = [1,2,3,12,4,5,'c','a','b'];
arr.sort();//[1,12,2,3,4,5,'a','b','c'];
// 如果需要按数字大小排列的话,需要在括号内加函数
// 函数的逻辑:看函数内的返回值。a-b
// 升序 1、为正数时,a>b,那么a往后排,b往前
// 2、为负数时或负数时,a<=b,那么不动
arr.sort(function(a,b){
if (a>b) {
return 1;//返回一个正数,a需要往后移。
}else{
return -1;//返回一个负数。
}
})
// 由于a>b时,a-b就是正数。a<b时,a-b就是负数。只要返回他们的减数就行。
// 所以简化如下
arr.sort(function(a,b){
return a-b;//升序
})
arr.sort(function(a,b){
return b-a;//降序
})
sort衍生的面试题
// 题:给一个有序的数组,将他随机乱序。
var arr = [1,2,3,4,5,6,7];
arr.sort(function(){
return Math.random() - 0.5;
})
// 解析:由于sort(function(){})内是要进行多伦对比,
// 每次对比都要返回一个正数或者负数来决定排序。
// 可以用Math.random() 0-1之间的随机数来觉得随机的正负数
// Math.random() - 0.5 就是随机的正负数
// 这样一来就会随机排序
// 题: 给下面数组,按照数组内对象的年龄大小排序
var deng = {
name : 'deng',
age : 52,
sex : 'male'
};
var zhang = {
name : 'zhang',
age : 20,
sex : 'male'
};
var cheng = {
name : 'cheng',
age : 34,
sex : 'male'
};
var people = [deng,zhang,cheng];
people.sort(function(a,b){
return a.age - b.age;
})
// 题:将数组内的值按长度排序
var arr = ['a','asdd','s','gefedsfsf','sadadsa'];
// 同理 只需要对length做比较
arr.sort(function(a,b){
return a.length - b.length;
})
// 题:将数组内的值按长度排序
var arr = ['a','asdd','s','gefedsfsf','sadadsa'];
// 同理 只需要对length做比较
arr.sort(function(a,b){
return a.length - b.length;
})
// 题:将数组内的值按字节长度排序
var arr = ['我是','123','嘿嘿嘿12','123554','你好撒23dd'];
// 思路:先封装一个求字节长度的函数
function retBytes(str){
var num = str.length;
for (var i = 0; i < str.length; i++) {
if (str.charCodeAt(i)>255) {
num++;
}
}
return num;
}
// 然后用sort排序
arr.sort(function(a,b){
return retBytes(a) - retBytes(b);
})
下面的方法会改变原数组
1.8 concat 拼接数组
arr1.concat(arr2);在arr1后面拼接上arr2.返回新数组。原数组不变
// 1、concat 拼接数组
// arr1.concat(arr2);在arr1后面拼接上arr2.返回新数组。原数组不变
var arr1 = [1,2,3];
var arr2 = [4,5,6];
var newarr = arr1.concat(arr2);//返回拼接后的新数组 [1,2,3,4,5,6]
// arr1跟arr2不变 依旧是[1,2,3] [4,5,6]
1.9 toString 将数组转为字符串
// 2、toString 将数组转为字符串
var arr = [1,2,3,4,5];
var newarr = arr.toString();//返回字符串"1,2,3,4,5"
// arr原数组不变。依旧[1,2,3,4,5]
1.10 slice 数组截取 一个参数或两个参数
arr.slice(开始截取位,截取到该位) 包左不包右
var arr = [1,2,3,4,5];
var newarr = arr.slice(2,4);//返回新数组[3,4]
//从索引第2位截取到3位,不包第4位。
// arr原数组不变
var newarr = arr.slice(2);//只传一个参数时,从该位截取到最后一位
arr.slice();//不传参时截取整个数组、
// 当传参为负数时,第二个参数不需要。加上不会截取
var newarr = arr.slice(-2);//从倒数第2位开始截取到最后一位。也就是截取后2位
1.11 join arr.join('链接符');
在join中加入需要的链接标识。将数组各项链接起来,组成字符串
var arr = [1,2,3,4,5];
var newStr = arr.join('~');//返回字符串"1~2~3~4~5"
arr.join();//不传参时,会自动用逗号连接"1,2,3,4,5"
arr.join("");//传空字符串时,会紧密连接。"12345"
// 题:将下列的多个字符串连成一个字符串
var str1 = 'alibaba',
str2 = 'baidu',
str3 = 'tencent',
str4 = 'toutiao',
str5 = 'wnagyi';
// 思路1:将字符串放在数组中,用循环将所有字符串放到新的字符串中
var newstr = "";
var arr = [str1,str2,str3,str4,str5];
for (var i = 0; i < arr.length; i++) {
newstr += arr[i];
}
// 缺点,由于字符串存在栈里。每一次+=都要取出来。效率低。
// 数组是堆内存。使用数组的方法更好
// 思路2:还是放在数组中,用join直接连接成字符
var arr = [str1,str2,str3,str4,str5];
var newstr = arr.join("");
1.12 slipt 将字符串按某个字符分隔成数组
var str = "你好吗~亲爱的~中国";
var newarr = str.split('~');//返回数组["你好吗", "亲爱的", "中国"]
//从~分隔。
str.split();//不传参或者传字符串中没有的字符时,
//会将整个字符串转成数组["你好吗~亲爱的~中国"]
str.split("");//传空字符串时,将字符串每一个字都分隔成数组
//["你", "好", "吗", "~", "亲", "爱", "的", "~", "中", "国"]