改变原数组:
※ push,pop,shif,unshift,sort,reverse
※ splice
不改变原数组:
※ concat,join→split,toString,slice
push :后一位添加
pop :后一位删除
shift :前一位删除
unshift :向前一位添加
sort :给数组排序(按ASCLL)
reverse :逆转顺序
splice :切片
系统push方法的实现:
var arr=[1,2,3]; Array.prototype.push=function(){ for(var i=0; i<arguments.length; i++){ this[this.length]=arguments[i]; } return this.length; }
splice方法:
var arr=[1,1,2,2,3,3]; //arr.splice(从第几位开始,截取长度,在切口处添加新数据) arr.splice(1,2);
arr.splice(1,1,0,0...)后面的参数无穷个
数组内部负数实现原理:
var arr=[1,2,3,4]; splice=function(pos){ pos += pos>0 ? 0:this.length; }
按ASCLL排序,不是理想中的排序,我们要按照数字大小排序,sort给我们留个编程接口让我们自己实现。里面添加匿名的function(必须要写两个形参){规则}
1.必须写两形参
2.看返回值:1)当返回值为负数,那么前面的数放在前面
2)为正数,那么后面的数放在前面
3)为0,不动
var arr=[2,4,9,10,13,18,20]; arr.sort(function(a,b){ if(a>b){ return 1; }else{ return -1; } })
简化前面代码:
var arr=[2,4,9,10,13,18,20]; arr.sort(function(a,b){ return a-b; })
条件判断a-b是否大于0,直接返回a-b
给数组乱序:
var arr=[2,4,9,10,13,18,20]; arr.sort(function(){ return Math.random()-0.5; })
按字符串长度排序:
var arr=["aaa","dddd","ccccd","dd","abcddddd"]; arr.sort(function(){ return a.length-b.length; })
按字节长度排序:
function retBytes(str){ var num=str.length;//接收字符串长度 for(var i=0;i<str.length;i++){//遍历字符串 if(str.charCodeAt(i)>255){//判断字符是中文还是英文字符 num++;//中文字符字节长度+1 } } return num; } var arr=['ac邓','bcd邓','ccccc老邓','dddddccc','dfhionnnangh']; arr.sort(function (a,b){ return retBytes(a)-retBytes(b);//比较字节是长度 })
concat拼接,不改变原数组
slice截取,不改变原数组
join连接,参数必须字符串类型
split和join互逆的,按参数拆开
字符串拼接,这样不好,字符串放在栈内存,原始值放在栈内存存储,栈先进后出,放在箱底里的东西,箱子上面的东西拿出来再放进去,拿出来再拼到一起,来回折腾栈,效力低。
数组是散列存储结构,是堆内存,散列结构,效率会高。