1. 程式人生 > >[Javascript 高階程式設計]學習心得記錄7 引用型別(上)

[Javascript 高階程式設計]學習心得記錄7 引用型別(上)

    js引用型別的值(物件)是引用型別的例項,引用型別和類很像但是又不是同一個東西,引用型別被稱為対象定義,描述一類物件所具有的屬性和方法。

    一,object型別

    object型別是js基礎原生型別,建立該型別例項有兩種方法:new和物件字面量表示法。

        var person = new Object();  // var person = {}; 一個效果
        person.name = "Nicholas";
        person.age = 29;
        var person = {
            name : "Nicholas",
            age : 29
        };
    物件字面量是向函式傳遞大量可選引數的首選方式。

    訪問也有兩種方式:person.name和person['name']。建議使用後種,可以使用變數來訪問屬性。

    二,Array型別

    建立方式也有兩種

        var colors = new Array(3);      //create an array with three items
        var names = new Array("Greg");  //create an array with one item, the string "Greg"

        alert(colors.length);
        alert(names.length);
        var colors = ["red", "blue", "green"]; //creates an array with three strings
        var names = [];                        //creates an empty array
        var values = [1,2,];                   //AVOID! Creates an array with 2 or 3 items
        var options = [,,,,,];                 //AVOID! creates an array with 5 or 6 items
        
        alert(colors.length);    //3
        alert(names.length);     //0
        alert(values.length);    //2 (FF, Safari, Opera) or 3 (IE)
        alert(options.length);   //5 (FF, Safari, Opera) or 6 (IE)
    而array的方法也是特別特別多,這對我們處理資料提供了很大的方便。值得注意的一點是,length屬性不是隻讀的,修改length屬性可以修改陣列長度。

1.檢測陣列方法

    Array.isarray()方法。雖然instanceof()方法也可以,但是有不同執行環境下,可能存在不同的Array建構函式,這個具體會在後面提到。所以推薦使用isarray()方法

2.轉換方法

    所有物件都有的toLocaleString(),toString()和valueOf()方法就不說了。值得注意的是,alert()會自動調toString()方法。

    有一個很實用的方法,join()。可以使用不同的分隔符來構建這個字串。這個我在日常開發的時候經常用到,非常實用。

        var colors = ["red", "green", "blue"];
        alert(colors.join(","));      //red,green,blue
        alert(colors.join("||"));     //red||green||blue
3.棧和堆方法

    push(),pop(),shift()三個方法,沒什麼特別的。主要是平時要記得靈活使用,很多時候都忘了這幾個方法。

        var colors = ["red", "blue"];
        colors.push("brown");              //add another item
        colors[3] = "black";               //add an item
        alert(colors.length);  //4
        
        var item = colors.pop();           //get the last item
        alert(item);  //"black"
		
		var item = colors.shift();                     //get the first item
        alert(item);   //"red"
        alert(colors.length);  //1
 4.重排序方法

有reverse ()翻轉陣列順序的方法,還有sort()排序方法。值得注意的一點是,sort()方法可以加一個比較函式作為引數,這樣可以自定義排序規則,其實在前面的心得3就是這個方法http://blog.csdn.net/m0_37645820/article/details/77867965,有興趣可以看看,給物件陣列排序。

        function compare(value1, value2) {
            if (value1 < value2) {
                return 1;
            } else if (value1 > value2) {
                return -1;
            } else {
                return 0;
            }
        }
        
        var values = [0, 1, 5, 10, 15];
        values.sort(compare);
        alert(values);    //15,10,5,1,0
5.操作方法

    主要有三個,concat()方法會建立一個當前陣列的副本,然後將接收到的引數新增到這個副本的末尾,最後返回新構建的陣列。和push()的區別就是,push操作的是陣列的本體,而concat是構成一個新的陣列,這點是值得注意的。

        var colors = ["red", "green", "blue"];
        var colors2 = colors.concat("yellow", ["black", "brown"]);
        
        alert(colors);     //red,green,blue        
        alert(colors2);    //red,green,blue,yellow,black,brown
        slice()方法,可以基於當前陣列中的一個或者多個項,建立一個新的陣列。而不會影響原來的陣列,和concat一樣。
        var colors = ["red", "green", "blue", "yellow", "purple"];
        var colors2 = colors.slice(1);
        var colors3 = colors.slice(1,4);
        
        alert(colors2);   //green,blue,yellow,purple
        alert(colors3);   //green,blue,yellow
        splice()方法是運算元組本體的,可以刪除,插入和替換陣列的元素。返回從原始陣列中刪除的項。
        var colors = ["red", "green", "blue"];
        var removed = colors.splice(0,1);              //remove the first item
        alert(colors);     //green,blue
        alert(removed);    //red - one item array
        
        removed = colors.splice(1, 0, "yellow", "orange");  //insert two items at position 1
        alert(colors);     //green,yellow,orange,blue
        alert(removed);    //empty array

        removed = colors.splice(1, 1, "red", "purple");    //insert two values, remove one
        alert(colors);     //green,red,purple,orange,blue
        alert(removed);    //yellow - one item array
    熟練掌握這三個方法和前面的棧堆方法,基本上就可以對陣列為所欲為了。

6.位置方法

    一個很簡單而且實用的方法,indexOf(),返回查詢值在陣列中的位置,找不到返回-1。值得注意的是,是按全等匹配的。

        var numbers = [1,2,3,4,5,4,3,2,1];
        
        alert(numbers.indexOf(4));        //3
        alert(numbers.lastIndexOf(4));    //5
        
        alert(numbers.indexOf(4, 4));     //5
        alert(numbers.lastIndexOf(4, 4)); //3       

        var person = { name: "Nicholas" };
        var people = [{ name: "Nicholas" }];
        var morePeople = [person];
        
        alert(people.indexOf(person));     //-1
        alert(morePeople.indexOf(person)); //0
7,迭代方法

    js陣列有5個迭代方法,接收兩個引數:要在每一項執行的函式和執行該函式的作用域(可選)。傳入的這個函式有三個引數:陣列項的值(intem),該項在陣列的位置(index)和陣列(array)本身。

        1、every(): 對陣列中的每一項執行給定的函式,如果該函式對每一項都返回true,則結果返回true。
        2、filter(): 對陣列中的每一項執行給定函式,返回該函式會返回true的項組成的陣列。
        3、forEach(): 對陣列中的每一項執行給定函式,這個方法沒有返回值。
        4、map(): 對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列。
        5、some(): 對陣列中的每一項執行給定函式,如果該函式任意一項返回true,則返回true。
        根據應用場景,可以分為三種。

        首先是檢驗用的every和some方法,every是陣列每項都通過才返回true,some是隻要有通過的就返回true。

        var numbers = [1,2,3,4,5,4,3,2,1];
        
        var everyResult = numbers.every(function(item, index, array){
            return (item > 2);
        });
        
        alert(everyResult);       //false
        
        var someResult = numbers.some(function(item, index, array){
            return (item > 2);
        });
        
        alert(someResult);       //true
    然後是篩選用的filter方法,返回通過的陣列元素組成的陣列。
        var numbers = [1,2,3,4,5,4,3,2,1];
        
        var filterResult = numbers.filter(function(item, index, array){
            return (item > 2);
        });
        
        alert(filterResult);   //[3,4,5,4,3]
    最後是迴圈操作的方法,map和forEach。forEach和for迴圈的效果其實是一樣的,沒有返回值。
        array.forEach(function(item, index, array)){
              //執行某些操作
        }
    而map的區別是,map是返回一個新的陣列,不會影響原來的陣列。
        var numbers = [1,2,3,4,5,4,3,2,1];
        
        var mapResult = numbers.map(function(item, index, array){
            return item * 2;
        });
        
        alert(mapResult);   //[2,4,6,8,10,8,6,4,2]
8. 歸併方法

    js陣列提供了歸併方法,reduce()。兩個引數:一個在每一項上都呼叫的函式和作為歸併基礎的初始值(可選)。這個函式有四個引數:前一個值,當前值,項的索引和陣列本身。所以歸併實際上是從陣列的第二項開始的。對於算累加,累乘等操作很方便。

        var values = [1,2,3,4,5];
        var sum = values.reduce(function(prev, cur, index, array){
            return prev + cur;
        });
        alert(sum);//15


後面還有RegExp型別,函式型別和基本包裝型別,下次再寫。