【讀書筆記】-- JavaScript數組

數組是一段線性分配的內存,它經過整數計算偏移並訪問其中的元素。大多數的語言都會要求一個數組的元素是相同類型,但JavaScript數組能夠包含任意類型。jquery

var misc = ['string', null, true, 98.4, undefined, NaN,2, { object: true }, Infinity, ['dd', 'ss']];
  console.log(misc.length);//10

長度

數組的length沒有上界,若是用大於等於當前length的數字做爲下標保存一個元素,那麼length會增大來容納新的元素,而不會發生邊界衝突。數組

          var myArray = [];
            console.log(myArray.length);//0
            myArray[10] = true;
            console.log(myArray.length);//11

ECMAScript標準:數組的下標必須是大於等於0且小於2^32-1的整數。若是執行下面的語句,則數組返回最近的一次長度。函數

myArray[4294967295] = true;
 console.log(myArray.length);//11

由於在上面代碼上執行的,結果爲11,若是去掉第三行代碼,length爲0.this

刪除

    var misc = ['string', null, true, 98.4, undefined, NaN, 2, { object: true }, Infinity, ['dd', 'ss']];
    delete misc[1];
    console.log(misc.length);//10
    console.log(misc[1]);//undefined

delete方法只刪除了元素,並無刪除下標。spa

 var misc = ['string', null, true, 98.4, undefined, NaN, 2, { object: true }, Infinity, ['dd', 'ss']];
            misc.splice(1, 1);
            console.log(misc.length);//9
            console.log(misc[1]);//true

splice的第一個參數是序號,第二個參數是個數。splice方法在刪除元素以後會讓後面的元素補齊。Jquery的toArray方法用來轉換數組。prototype

方法

經過給Array的原形擴充一個函數,每一個數組都會繼承這個方法。下面的例子定義了一個reduce方法,接受一個函數和一個初始值爲參數,內部會遍歷數組調用這個方法。返回計算的結果。而後用來求總和和乘積。code

    Array.prototype.reduce = function(f, value) {
                for (var i = 0; i < this.length; i++) {
                    value = f(this[i], value);
                }
                return value;
            };

            var data = [4, 5, 6, 8, 9];

            var add = function(a, b) {
                return a + b;
            };
            var mult = function(a, b) {
                return a * b;
            };

            console.log(data.reduce(add, 0));//32
            console.log(data.reduce(mult, 1));//8640

[]定義數組與{}定義數組的區別

數組爲空的時候,值爲undefined,{}定義的數組沒有length。對象

            var empty = [];
            var numbers = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
            console.log(empty[1]);//undefined
            console.log(numbers[1]);//
            console.log(empty.length);//0
            console.log(numbers.length);//10

            var number_object = { '0': '零', '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六', '7': '七', '8': '八', '9': '九' };
            console.log(number_object[1]);//
            console.log(number_object.length);//undefined

numbers繼承Array.prototype 而number_object 繼承Object.prototype 所以numbers繼承了大量有用的方法。不過typeof numbers和typeof number_object 返回的都是object。blog

 

轉換:繼承

Jquery的toArray方法是調用了Array原型的slice方法。主要是用於將元素集合、參數轉爲數組。由於數組擁有更多方法。

 slice = Array.prototype.slice;
            toArry:function(){
                slice.call(this,0);
            }

不過上面的number_object要轉換須要加上length屬性。

var number_object = { length:10,0: '零', 1: '一', '2': '二', '3': '三', '4': '四', '5': '五', '6': '六', '7': '七', '8': '八', '9': '九' };
Array.prototype.slice.call(number_object);
//["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]

若是沒有長度,或者長度不對,會返回一個空數組。

判斷:

那如何判斷一個對象是否是數組呢,經過上面的例子咱們知道type of 返回的都是'object',參考Jquery的isArray方法。

 isArry:Array.isArray||function(obj) {
                    return jquery.type(obj) === 'array';
                },
                type: function(obj) {
                    return obj == null ? String(obj) : class2type[toString.call(obj)] || 'object';
                }

class2type這裏是一個鉤子,包含了全部Object的類型。而這個toString是Object原型的一個方法。

  console.log(Object.prototype.toString.call(numbers));//[object Array]
   console.log(Object.prototype.toString.call(number_object));//[object Object]

而這個原型方法會返回 ‘[object Array]’,[object Boolean],[object Data],[object Function],[object Number],[object RegExp],[object String]幾種類型。這樣就很方便用來判斷。

閱讀書目:《JavaScript語言精粹》《Jquery技術內幕》

相關文章
相關標籤/搜索