2014-02-12 105 views
1

我想擴展Array.prototype以包含一個正方形函數。我有這樣的:擴展Array.prototype返回undefined

Array.prototype.square = function(){ 
    return this.forEach(function(el){ 
    return (el * el) 
    }); 
} 

當我打電話陣列上這個功能,說arr = [2, 2, 2]則返回undefined。如果我在那裏添加一個console.log,我可以看到forEach函數的回調函數正確執行 - 它記錄了三次。爲什麼這個函數返回undefined而不是[4,4,4]的新數組?

+1

'.forEach()'函數不返回值。 – Pointy

+0

注意:如果可用,使用Object.defineProperty(Array.prototype,'square',{value:function(){...}})'來防止函數成爲_every_數組實例的枚舉屬性。 – Alnitak

回答

6

forEach方法不返回值。您需要使用map

Array.prototype.square = function(){ 
    return this.map(function(el){ 
    return (el * el) 
    }); 
} 

console.log([2, 2, 2].square()); // [4, 4, 4] 
+1

爲什麼地圖需要?爲什麼我無法使用forEach?我真的是一名JavaScript工程師,所以我一直在努力學習更多。請原諒我的無知! –

+1

s /真的/不真的/? – Alnitak

+3

@ChrisClouten'forEach'只是迭代而不返回任何東西 - 'map'會根據原始的每個元素上調用回調的結果返回一個新數組。 – Alnitak

2

由於p.s.w.g.說,.map是適當的功能,但在你問的關於使用forEach的評論。爲了得到這個工作,你必須創建一個臨時數組:

Array.prototype.square = function(){ 
    var tmp = []; 

    this.forEach(function(el){ 
    tmp.push(el * el) 
    }); 

    return tmp; 
} 

console.log([2, 2, 2].square()); // [4, 4, 4] 

.map()比較好,雖然。