Добавил Array.prototype.count, но появилась проблема...
Здравствуйте!
Добавил метод подсчета числа элементов: Array.prototype.count = function() { var result = 0; for(var i in this) { if (!this.hasOwnProperty(i)) continue; result++; } return result; }; Но он выдает на один больше число. Выяснил что оказывается среди подсчитываемых индексов i попадается и добавленный метод count. Скорректировал так: Array.prototype.count = function() { var result = 0; for(var i in this) { if (!this.hasOwnProperty(i) || i == "count") continue; result++; } return result; }; Вопрос, почему не попадаются прочие методы (push, pop и пр.)? И что делать, когда я добавлю еще методы в Array.prototype? |
Цитата:
Цитата:
К слову, ES5 позволит наконец указывать атрибуты вроде DontEnum для своих свойств, так что можете подождать повсеместной имплементации нового стандарта. UPD: как заметил Sweet, в данном случае такой проблемы не должно быть, т.к. hasOwnProperty('count') вернет false. |
Что за гонево?!:blink: Есть проверка hasOwnProperty, так что метод нормально считает.
|
Не надо перебирать массивы циклом for-in.
|
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Действительно гонево, хуже некуда...
Код: <script type="text/javascript"> Array.prototype.count = function() { var result = 0; for(var i in this) { if (!this.hasOwnProperty(i)) continue; result++; } return result; }; </script> <script type="text/javascript"> var arr = ["один", "два", "три"]; alert(arr.count()); </script> ...отрабатывает верно. Выдает 3 на выходе. Получается у меня где-то в массив попадает элемент с именем этого метода. Причем если имя метода поменять, то новое имя будет попадать... Придется искать где собака зарыта. Спасибо за отклики! |
Часовой пояс GMT +3, время: 09:07. |