我遇到了一个相当有趣的问题。下面的代码生成一个数组,在记录时会给出 value [undefined × 1]
。根据这个答案,这意味着数组具有未初始化的索引——在这种情况下,只有一个。但是,由于我只是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()
. 你可以在这里找到一个演示问题的小提琴。
所以......关于什么可能导致这种情况的任何想法?这实际上是我嵌套对象的方式的问题吗?(我按照我的上一个问题的答案中给我的模式做的)。
如果您想知道我可能在这里尝试做什么,我将外部对象视为一种命名空间,我这样做是为了避免混淆全局命名空间(这最终将成为一个寻路库,如果我在这里一起行动)。该Foo
对象是一种有序列表,这样我可以通过堆栈获得最近的节点(具有最低param
属性的节点) 。pop()