2009年9月24日 星期四

[JavaScript] Chapter 6&7 Notes

Reference: JavaScript - The Definitive Guide Chapter 6, Chapter 7
  • for/in loop: (section 6.9)
    1. 可以動態改變指定的 variable,例如下面這段程式碼複製 obj 的所有屬性名稱到 arr 中。
        var obj = {x:1, y:2, z:3};
        var arr = new Array( );
        var i = 0;
        for(arr[i++] in obj) /* empty loop body */;
      
    2. for/in 存取 property 並沒有依照某個順序,完全是 implementation-dependent,所以在 loop 中新增/刪除某個 property 要好好考慮。
  • with 指令會暫時改變 scope chain,雖然程式碼比較好寫,但執行效率會變差,盡量不要用。(section 6.18)

  • 當 object 用 obj["prop"] 來存取時,"prop"可以做 string 的操作,例如 obj["prop"+i] 動態決定要存取什麼屬性。如果用 obj.prop 的寫法,則 prop 當然是寫死的文字。這就是兩種 object 存取方式的差別。(section 7.3)

  • 所有自訂的 object 屬性都是 enumerable 的 (ie. 可使用 for/in loop 存取);Nonenumerable 屬性指的是繼承 Object class 來的那些屬性。所以 propertyIsEnumerable()(某自訂屬性是否 enumerable) 得到的結果幾乎會跟 hasOwnProperty() (是否有某個自訂屬性)一樣。(section 7.4)

  • delete 指令對 Array 元素的作用是讓它變成 undefine,實際上該元素還是會在。Array.shift()Array.pop()、跟 Array.splice() 才是真正會刪除某個元素,並且平移其他元素的指令。(section 7.6)

  • Array 的 length 這個屬性永遠是當前最高位元素的 index+1,無論之間的內容是不是連續的。例如宣告 a[0] = 1; a[49] = 100;a.length = 50。(section 7.6)

  • length 是一個可設定的值,假如新的值比原本小,那多的元素就會被丟掉;假如比原本大,會塞一些 undefined 元素到 array 中。 (section 7.6)

  • 雖然 object 可以用 obj[0] = value; 這種類似 array 的方式存取,但那也只是「新增加一個名字為 0 的屬性」而已,跟 array 還是不同,當然也不會有 length 這個屬性。(section 7.6)

  • Array 的 sort() 會依照「字母順序」排序元素,無論元素的型態是什麼。如果想要自訂排序方式,可以傳一個比較函數給它,例如這樣:(section 7.7)
    var a = [33, 4, 1111, 222];
    a.sort();                 // Alphabetical order:  1111, 222, 33, 4
    a.sort(function(a,b) {    // Numerical order: 4, 33, 222, 1111
             return a-b;      // Returns < 0, 0, or > 0, depending on order
           });
    

  • Array 的 concat() 函數把參數中的值加到原本 array 的最後面,並回傳。如果參數內給的也是 array,那第一層會被拆掉。例如下面這樣:(section 7.7)
    var a = [1,2,3];
    a.concat(4, 5)          // Returns [1,2,3,4,5]
    a.concat([4,5]);        // Returns [1,2,3,4,5]
    a.concat([4,5],[6,7])   // Returns [1,2,3,4,5,6,7]
    a.concat(4, [5,[6,7]])  // Returns [1,2,3,4,5,[6,7]]
    

  • slice() 會回傳原本 array 中參數指定的部份。參數可以用負數表示從最後一個元素的相對位置,例如 -3 表示從後面數來第三個。

  • splice() 可以新增或刪除 array 元素,並且平移其他元素讓整個 array 還是連續的。而且它是直接作用在呼叫的 array 上面,回傳切下來的部份。第一個參數表示起始index,第二個參數(省略則直接到最後)表示作用的數目,第三個以後的參數表示要加上去的新元素。直接看例子:(section 7.7)
    var a = [1,2,3,4,5,6,7,8];
    a.splice(4);    // Returns [5,6,7,8]; a is [1,2,3,4]
    a.splice(1,2);  // Returns [2,3]; a is [1,4]
    a.splice(1,1);  // Returns [4]; a is [1]
    
    var a = [1,2,3,4,5];
    a.splice(2,0,'a','b');  // Returns []; a is [1,2,'a','b',3,4,5]
    a.splice(2,2,[1,2],3);  // Returns ['a','b']; a is [1,2,[1,2],3,3,4,5]