У меня возникла довольно интересная проблема. В приведенном ниже коде создается массив, который при регистрации регистрирует значение [undefined × 1]
. Согласно this answer, это означает, что массив имеет униализированные индексы - в этом случае только один. Однако, поскольку я использую только array.push()
, чтобы избежать такого рода проблем, я потерял. Насколько мне известно, причиной этой проблемы может быть присвоение индекса хотя бы одним индексом, большим, чем другие инициализированные индексы. Во всяком случае, вот код:Единичные переменные в массиве при использовании только Array.push?
function Thing(params) {
var that = this;
this.OtherObject = function OtherObject(param) {
this.param = param;
}
this.Foo = function Foo() {
this.bar = [];
this.add = function(item) {
if (this.bar.length != 0) {
for (var i = 0, len = this.bar.length; i < len; i++) {
if (this.bar[i].param <= item.param) {
this.bar.splice(i, 0, item);
}
}
} else {
this.bar[0] = item;
console.log(this.bar);
}
}
this.pop = function() {
return this.bar.pop();
}
this.length = function() {
return this.bar.length;
}
}
this.someFunc = function() {
var myThing = new that.Foo();
myThing.add(new that.OtherObject(3));
while (myThing.length() > 0) {
var someVar = myThing.pop();
}
}
}
var myThing = new Thing({
myParam: "someValue"
});
myThing.someFunc();
Я создал тестовый пример, чтобы увидеть, если я мог бы локализовать проблему, но я в конечном итоге повторно набрав 95% мой код, пока я снова не столкнулся с вопросом, который появляется чтобы быть связанным с моим использованием myThing.pop()
. Вы можете найти скрипку here, которая демонстрирует проблему.
Итак ... любые идеи относительно того, что может быть причиной этого? Это на самом деле проблема с тем, как я вложил свои объекты? (что я сделал по шаблону, приведенному мне в this answer, на предыдущий вопрос).
В случае, если вам интересно, что я мог бы здесь сделать, я рассматриваю внешний объект как своего рода пространство имен, которое я делаю, чтобы избежать загромождения глобального пространства имен (это в конечном итоге будет библиотеку путей, если я получу свой совместный акт здесь). Объект Foo
предназначен для своего рода упорядоченного списка, так что я могу получить ближайший узел (тот, который имеет самое низкое свойство param
) на pop()
в стеке.
В каком браузере вы тестируете это? Вы пробовали других? – loganfsmyth
Возможно, вы захотите дважды проверить, что это значение действительно неверно.Это выглядело просто пустым для меня, что все еще странно, пока я не вспомнил, что Chrome динамически обновляет некоторый вывод console.log. Поэтому, поскольку вы позже выходили, он обновлял напечатанный массив, отображаемый как пустой. Или что-то. Если вы выполните console.log (this.bar.toString()), вы видите элемент? – loganfsmyth