Добавил 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, время: 23:42. |