gpt4 book ai didi

javascript - 仅使用 Array.push 时数组中未初始化的变量?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:20:27 25 4
gpt4 key购买 nike

我遇到了一个相当有趣的问题。下面的代码生成一个数组,在记录时给出值 [undefined × 1]。根据this answer ,这意味着该数组具有未初始化的索引——在本例中,只有一个。但是,由于我只是使用 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()。你可以找到一个 fiddle here这证明了所讨论的问题。

那么...关于可能导致这种情况的原因有什么想法吗?这实际上是我嵌套对象的方式的问题吗? (我确实按照 this answer 中给我的模式来回答我之前的一个问题)。

如果您想知道我可能会在这里尝试做什么,我将外部对象视为一种命名空间,我这样做是为了避免弄乱全局命名空间(这最终将是一个寻路库,如果我在这里齐心协力的话)。 Foo 对象是一种有序列表,以便我可以通过 pop() 获得最近的节点(具有最低 param 属性的节点) 进入堆栈。

最佳答案

Google Chrome 的 console.log 函数发生了一些非常奇怪的事情。其他浏览器的行为似乎与您预期的一样。这是我见过的最奇怪的事情之一:如果你在调用 console.log 的 lne 之后添加对 alert 的调用,将有不同的输出控制台。

console.log(this.bar);
alert(this.bar);

// [> OtherObject]

如果删除alert,如您所见,控制台将输出

// [undefined × 1] 

这种事情要么是由于某些竞争条件,要么是 alert 函数引起的某些副作用。这是我对幕后发生的事情的理论:

  • console.log 函数在代码暂停之前实际上不会在控制台中记录值,然后它会记录所有排队的消息。该队列包含对要记录的消息的引用。
  • this.bar 中的第一项在弹出数组时被销毁。记录器,除非有一些中断,将在引用值被销毁后显示消息。因此,它显示 [undefined × 1]
  • 调用 alert 会导致代码暂停,以便控制台可以在删除引用值之前记录消息。

我仍然不完全确定这是否真的发生了,但它似乎有点合理。我会做更多的测试来检查我的理论是否正确。

关于javascript - 仅使用 Array.push 时数组中未初始化的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com