2014-09-28 63 views
0

我正在查看一個underscore.js函數來檢索對象中的值,並且很想了解_.values函數以何種方式創建的原因。在這裏做的折衷是什麼? (push vs. Array)

如在underscore.js功能:

_.values = function(obj) { 
    var keys = _.keys(obj); 
    var length = keys.length; 
    var values = Array(length); 
    for (var i = 0; i < length; i++) { 
     values[i] = obj[keys[i]]; 
    } 
    return values; 
    }; 

我相信這也將工作不過:

_.values = function(obj) { 
    var keys = _.keys(obj); 
    var length = keys.length; 
    var values = []; 
    for (var i = 0; i < length; i++) { 
     values.push(obj[keys[i]]); 
    } 
    return values; 
    }; 

什麼是使用功能#1對#2之間的權衡。僅僅是爲了表現還是還有其他的東西?

謝謝。

回答

3

第一種方法允許JS運行時立即分配正確數量的內存。

在空數組上調用push()將強制數組在調整大小時會浪費時間和內存。

+0

直覺從類似C語言的數組經常在JS中崩潰。你能否更詳細地解釋爲什麼這在這裏直觀地工作? – djechlin 2014-09-28 01:51:48

+1

@djechlin:因爲現代JS運行時非常聰明,並且會嘗試變得更像C。 (準確的答案是數組實現像Java ArrayList,而不是散列表,在適當的情況下) – SLaks 2014-09-28 01:52:47

+0

有道理@SLaks - 謝謝! – sidewalksalsa 2014-09-28 02:06:35