js-數組
數組的定義
- new Array(length/content)
- 字面量
- 區別:當只傳一個參數時,new Array會把參數當成是長度,即創建一個限定長度的值為undefined的數組;字面量則認為這一個參數是數組第一個元素。
//數組的定義
var arr = [1,2,3];//數組字面量
var arr1 = new Array(1,2,3,4,5);
var arr2 = new Array(10);//[object Array]: [, , , , , , , , , ];length: "10"
var arr3 = [10];//[object Array]: [10];length: "1"
數組的讀和寫
- 讀:arr[num];//不能溢出讀,結果為undefined
- 寫:arr[num] = xxx; //可以溢出寫
數組常用的方法 (基於ES3.0)
1.改變原數組
- push, pop, shift, unshift, reverse,sort
- splice
//數組常用的方法
//1.push--在數組末尾添加元素
var arr = [1,2,3];
Array.prototype.push = function(num){
for(var i = 0;i < arguments.length; i++){
this[this.length] = arguments[i];
}
return this.length;
}
arr.push(4,5,6);//[1,2,3,4,5,6]
//2.pop--從數組后面剪切最后一個元素,返回被剪切的元素
arr.pop();//[1,2,3,4,5]
//3.shift--從數組前面剪切
arr.shift();//[2,3,4,5]
//4.unshift--從數組前面插入
arr.unshift(0,0);//[0,0,2,3,4,5]
//5.reverse--數組元素反轉
arr.reverse();//[5,4,3,2,0,0]
//6.splice--截取數組,在特定位置添加元素;arr.splice(從第幾位開始,截取幾位,在切口處添加新的數據);
arr.splice(1,3,0,0);//[5,0,0,0,0]
//7.sort--數組元素排序
var arr1 = [2,3,1,-1,0,9];
arr1.sort();//[-1,0,1,2,3,9]
var arr2 = [1,3,4,2,10];
arr2.sort();//[1,10,2,3,4];按ASCII碼排序
//重寫sort函數:1)一定要寫兩個參數;2)看返回值:①當返回值為負數時,那么前面的數放在前面;②為整數,后面的數放在前;③為0,不動
arr2.sort(function(a,b){
return a<b?-1:1;//return a-b;//升序
//return a>b?-1:1;//return b-a;//降序
});
//sort方法的其他拓展
//給一個有序的數組返回隨機的亂序數組
var arr3 = [1,2,3,4,5,6];
arr3.sort(function (a,b){
return Math.random()-0.5;
});
var chen = {
name:"chen",
age:10,
gender:"female"
};
var cheng = {
name:'deng',
age:30,
gender:'undefined'
};
var he = {
name:'he',
age:40,
gender:'male'
};
var arr4 = [chen,he,cheng];
arr4.sort(function(a,b){
return a.age - b.age;
});
var arr5 = ['a','sdffeee','df陳陳陳陳','dweshyrrebe','dfrfa'];
arr5.sort(function(a,b){
// return a.length-b.length;//按字符串長度排序
return retBytes(a)-retBytes(b);//按字符串字節長度排序
});
function retBytes(a){
var cnt = 0;
for(var i = 0;i < a.length;i++){
(a.charCodeAt(i)>255) ? ++cnt : cnt;
}
var res = a.length + cnt;
return res;
}
2.不改變原數組
- concat, join --> split, toString, slice
//不改變原數組
//1.concat
var arr = [1,3,4];
var arr1 = [4,5,6,9];
var arr2 = arr.concat(arr1);
console.log(arr);//[1,3,4]
console.log(arr1);//[4,5,6,9]
console.log(arr2);//[1,3,4,4,5,6,9]
//2. toString -- 把數組重寫成字符串
toString(arr);
console.log(arr);
//3. join--把數組用特定字符連接成字符串
var str = arr.join("-");//"1-3-4"
str = arr.join("");//"134"
//4. split--把字符串分割成一個字符串數組
var str1 = 'andnjhskj,sjvshv';
console.log(str1.split(','));//["andnjhskj","sjvshv"]
console.log(str1.split(',',1));//["andnjhskj"]
//5. slice--從已有數組中返回選定的元素
var arr3 = [1,2,3,4];//arr.slice(開始截取的位置,直到這一位之前)
console.log(arr3.slice(1,3));//[2,3]
類數組
- 類數組 --> 屬性要為索引屬性,必須要有length屬性,最好加上push。
var obj = {
"2":"a",
"3":"b",
"length":2,
"push":Array.prototype.push,
"splice":Array.prototype.splice
}
obj.push("c");
obj.push("d");
console.log(obj);//[obj] = {"2":"c","3":"d","length":4,"push":Array.prototype.push,"splice":Array.prototype.splice}
//因為Obj的push是根據length對應的位置添加的,而原對象里面的length=2,即第一個元素的key名稱。
//push 原理
Array.prototype.push = function push(target){
obj[obj.length] = target;
obj.length++;
}