Javascript漂流記(上)__數組、類數組

一、數組:
       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課程" ,一個值得推薦的"渡一教育"。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章