一、數組:
1、定義方式:
數組字面量var arr = [1,2,3,4,5];
構造方法var arr = new Array(1,2,3,4,5);
二者有區別,如var arr1 = new Array(10); 是一個長度爲10的稀疏數組。
2、數組的讀和寫:
數組是特殊的對象,讀寫都可溢出,讀取沒有的值返回undefined。
3、數組的方法
1. 改變原數組:
var arr = [];
arr.push(666,666)在數組的最後添加
arr.pop()把數組的最後一位剪切掉
arr.shift()從數組前面剪切
arr.unshift()在數組前面添加
arr.reverse()倒序
arr.splice(iIndex,[iHowmany],[item1],[item2]),挺重要
arr.splice(1,2,3,4)從第一位開始,截取兩位,在切口處放入3,4
arr.splice(-1,2)從倒數第一位開始,截取倆唄
arr.sort()數組方法的扛把子,好好掌握,拓展
暴力模擬push方法:
var arr = [];
Array.prototype.push = function(){//沒法傳參數,不定數量的
for(var i = 0; i < arguments.length; i++){
this[this.length] = arguments[i];
}
return this.length;
}
天殺的sort方法:
var arr = [1,3,2,10,9,7,5];
console.log(arr.sort());//[1, 10, 2, 3, 5, 7, 9],什麼情況
優化sort方法:
1. 必須寫倆形參
2. 看返回值
1)返回值爲負,前面的數放前面
2)爲正,調位置,後面的數在前
3)爲0,不動
var arr = [1,3,2,10,9,7,5];
arr.sort(function(a,b){//函數會被多次調用,冒泡排序的方式比較.
// if(a > b){
// return 1;
// }else{
// return -1;
// }
return a-b;//由上面推導得出: returna-b;升序 ,return b-a;降序!!!
});
console.log(arr);
sort拓展:
給一個有序的數組,亂序:
var arr = [1,2,3,4,5,6,7];
arr.sort(function(){
return Math.random() - 0.5;
});
console.log(arr);
按照年齡升序排序:
var zhangFei = {name : 'zhangfei', age : 18}
var liKui = {name : 'likui', age : 15}
var guanYu = {name : 'guanyu', age : 20}
var arr = [zhangFei, liKui, guanYu];
arr.sort(function(a,b){
return a.age - b.age;
})
console.log(arr);
2. 不改變原數組:
arr1.concat(arr2)
toString,詳情查閱之前筆記
var newArr = arr.slice(iStart,iEnd)從該位開始截取,截取到該位(不包括該位)
arr.join('-'),按照傳遞的參數(字符串,啥字符串都行),連接數組的每一位,返回一個字符串
str.split('-'),是字符串的方法,和join互逆的,按照傳遞的參數拆分,返回一個數組
將下列字符串連接到一起:
var str1 = 'Alibaba',
str2 = 'Tencent',
str3 = 'Baidu',
str4 = 'Sina',
str5 = 'Meituan'
var arr = [str, str1, str2, str3, str4, str5];
console.log(arr.join(''));
數組去重(在原型鏈上編程):
Array.prototype.unique = function(){
var temp = {},//數組的每一位當做對象的屬性名,隨便賦給值
newArr = [],
len = this.length;
for(var i = 0; i < len; i++){
if(!temp[this[i]]){
temp[this[i]] = 'abc';
newArr.push(this[i]);
}
}
return newArr;
}
字符串去重(在原型鏈上編程):把字符串變成數組
String.prototype.unique = function(){
var arr = this.split('');
temp = {},//數組的每一位當做對象的屬性名,隨便賦給值
newArr = [];
len = arr.length;
for(var i = 0; i < len; i++){
if(!temp[arr[i]]){
temp[arr[i]] = 'abc';
newArr.push(arr[i]);
}
}
return newArr.join('');
}
找出字符串第一個只出現一次的字母:
function FirstNoRepeatLetter(str){
var arr = [];
for(var i = 0; i < str.length; i++){
if(arr[str[i]] == undefined){
arr[str[i]] = 1;//arr['p'] = 1,arr['o'] = 1
}else{
arr[str[i]]++;//arr['p'] = 2,arr['o'] = 2
}
}
console.log(arr);
for(var j = 0; j < str.length; j++){
if(arr[str[j]] == 1){
console.log(j);
return j;
}
}
}
FirstNoRepeatLetter('mnbvcfxzxcvubnm,mnbvcxcvbnm');
二、類數組(例如arguments,DOM等)
屬性爲索引屬性,必須有length屬性!!!最好加上push。
var obj = {
0 : 'a',
1 : 'b',
2 : 'c',
length : 3,
push : Array.prototype.push,//理解push內部原理
splice : Array.prototype.splice
}
obj.push('d');
push內部原理:
Array.prototype.push = function(target){
this[this.length] = target;//此時的this是obj
this.length++;
}
阿里鄙視題:
var obj = {
2 : 'a',
3 : 'b',
length : 2,//決定了push到哪個位置
push : Array.prototype.push//理解push內部原理
}
obj.push('c');
obj.push('d');
以上內容屬二哥原創,整理自 "渡一教育Javascript課程" ,一個值得推薦的"渡一教育"。