over 3 years ago

Array vs Object

許多人常常會搞不清楚array與object的差別,在使用上也常常的混著用,我們先來探討實際上的差異

先看一個example:

var alpha_array = ['a','b','c','d'];
var alpha_object = {0:'a',1:'b',2:'c',3:'d'};

alpha_arrayalpha_object會產生相似的效果,都是包含四個屬性,具有相同的key-value,操作的方式也類似

console.log(alpha_array[0]);//a

console.log(alpha.object[0]);//a

但是兩者仍有十分明顯的差異,alpha_array卻是繼承自Array.protopyte,而alpha_object繼承自Object.prototype, 所以alpha_array會擁有Array該有的method,舉例來說: length

console.log(alpha_array.length); // 4  

console.log(alpha_object.length); // undefined

好,那我們該如何知道某個物件是屬於array還是object? 只透過typeof不可行,因為兩者回傳的皆為object

console.log(typeof alpha_array);// object  

console.log(typeof alpha_object);// object

必須再透過constructor的來進行確認

console.log(alpha_array.constructor === Array);// true

console.log(alpha_object.constructor === Array);// false

於是我們可以透過以下的方法來確定是否屬於array

function isArray(value){  
    return typeof value === 'object' && value.constructor === Array;
}

以下是Javascript: The Good Parts中,作者所提供的陣列偵測方法

function isArray(value){
    return value &&  
        typeof value === 'object' &&  
        typeof value.length === 'number' &&  
        typeof value.splice === 'function' &&  
        !(value.propertyIsEnumerable('length'));  
}

Array Element Deletion

透過delete

因為array其實也是object,所以可以透過delete來刪除陣列內的元素

var arr = ['a','b','c','d','e'];  
delete arr[1];
console.log(arr);// ['a',undefined,'c','d','e']

console.log(arr.length);// 5

從上面的例子中可以發現,被delete的元素會變成undefined,所以length並不會改變

透過splice

array.slice([begin[, end]]),begin為欲刪除的開始位置,end為欲刪除的元素數量

var arr = ['a','b','c','d','e'];  
arr.splice(1,1);
console.log(arr);// ['a','c','d','e']

console.log(arr.length);// 4

Array Dimension

js中沒有超過一個維度的陣列,但同c/c++語言,陣列內的元素也可以是陣列

var matrix = [
    [0,1,2],
    [3,4,5],
    [6,7,8]
];
console.log(matrix[1,1]);// 4

以上程式也可以寫為

var matrix = [];
var row = 3, col = 3 ;
for (var i = 0; i < row; i++){
    matrix[i] = [];
    for(var j = 0; j < col; j++){
        matrix[i][j] = i * row + j;
    }
}
← Javascript 閉包 Closure
 
comments powered by Disqus