2017-07-18 20 views
2

有人可以請解釋我這行代碼如何工作。[] .push.apply如何工作?

[].push.apply(perms, permutation(arr.slice(0), start + 1, last)); 

該函數生成一個輸入數組所有排列的數組;

var permutation = function(arr, start, last){ 
    var length = arr.length; 

    if(!start){ 
    start = 0; 
    } 

    if(!last){ 
    last = length - 1; 
    } 

    if(last === start){ 
    return [arr]; 
    } 

    var temp; 
    var perms = []; 

    for(var i = start; i < length; i++){ 
    swapIndex(arr, i, start); 
    console.log(arr); 

    [].push.apply(perms, permutation(arr.slice(0), start + 1, last)); 

    swapIndex(arr, i, start); 
    } 

    return perms; 
}; 
+0

你有沒有興趣'apply'方法?這是您可以調用Javascript方法/函數的類型之一。你可以閱讀關於'call'和'apply'的內容。可能是https://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply可以幫助 – murli2308

+1

什麼具體造成混亂? –

回答

3

[].push創建一個新的數組,然後提取push,它與Array.prototype.push相同,但每次需要進行垃圾收集時都會創建一個未使用的對象。

如果你打電話Array.prototype.push(5)它不會工作,因爲this不會被設置爲數組或擴展數組的東西。因此,如果要使用任意函數作爲方法工作,則需要使用Function.call,Function.applyFunction.bind來設置this

如果你有 Array.prototype.push.apply(thisObject, arrArguments)相同 thisObject.push(arrArguments[0], arrArguments[1], ..., arrArguments[n])如果thisObject在其原型鏈push

perms.push.apply(perms, permutation(arr.slice(0), start + 1, last)); 

使用的apply是因爲push得到permutations陣列作爲參數的所有內容:由於perms是一個數組,有它自己的原型鏈push它可能被替換。因此如果permutations(....)返回[1,2,3]它將與perms.push(1, 2, 3)同義。

for (var e of permutation(arr.slice(0), start + 1, last)) { 
    perms.push(e); 
} 

而且在ES6,你可以簡單地使用spread syntax這是一樣的apply,但簡單的理解:你可以通過調用push每個元素寫不apply

perms.push(...permutation(arr.slice(0), start + 1, last)) 
+0

非常感謝,這真的解決了我的困惑。 –

0

擴展它是一樣的:

Array.prototype.push.apply(arrryToPushTo, ArrayOfItemsToPush)

apply()是從Function.prototype.apply()Array.prototype.push是一個函數。

使用一個空數組代替書寫"Array.prototype"暴露出push()方法apply()可以被調用,並且被簡單地完成,因爲"[]"是少的字符比"Array.prototype"寫。