2014-02-12 3 views
1

Я пытаюсь расширить Array.prototype, чтобы включить квадратную функцию. У меня есть это:Расширение Array.prototype возвращает undefined

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

Когда я вызываю эту функцию на массив, скажем, arr = [2, 2, 2] он возвращает неопределенное значение. Если я добавлю console.log, я вижу, что функция обратного вызова для функции forEach выполняется правильно - она ​​регистрируется 4 раза три раза. Почему эта функция возвращает undefined вместо нового массива из [4, 4, 4]?

+1

Функция '.forEach()' не возвращает значение. – Pointy

+0

NB: если доступно, используйте '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() лучше, хотя.

Смежные вопросы