Javascript 仅使用array.push时数组中的单位化变量?

Javascript 仅使用array.push时数组中的单位化变量?,javascript,Javascript,我遇到了一个相当有趣的问题。下面的代码生成一个数组,当记录时,该数组给出值[undefined×1]。根据,这意味着数组有统一的索引——在本例中,只有一个索引。然而,由于我只使用了array.push()来避免这类问题,所以我有点不知所措。据我所知,仅为索引指定至少一个大于其他初始化索引的索引可能会导致问题。无论如何,代码如下: function Thing(params) { var that = this; this.OtherObject = function Other

我遇到了一个相当有趣的问题。下面的代码生成一个数组,当记录时,该数组给出值
[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();
​
函数对象(params){
var=这个;
this.OtherObject=函数OtherObject(param){
this.param=param;
}
this.Foo=函数Foo(){
this.bar=[];
this.add=函数(项){
如果(this.bar.length!=0){
for(var i=0,len=this.bar.length;i
我创建了一个测试用例,看看是否可以缩小问题的范围,但最后我重新键入了95%的代码,直到我再次遇到这个问题,这似乎与我使用的
myThing.pop()
有关。你可以找到一把小提琴来演示这个问题

那么…有没有关于是什么原因的想法?这实际上是我嵌套对象的方式的问题吗?(我是按照我之前的问题中给出的模式来做的)


如果您想知道我可能在这里做什么,我将外部对象视为一种名称空间,我这样做是为了避免弄乱全局名称空间(如果我在这里集中精力的话,这将最终成为一个寻路库).Foo对象是一种有序列表,这样我就可以通过
pop()获得最近的节点(具有最低
param
属性的节点)
ing the stack.

Google Chrome的
控制台.log
功能出现了一些非常奇怪的情况。其他浏览器的行为似乎与您预期的一样。这是我看到的更奇怪的事情之一:如果在调用
控制台.log
的lne之后添加对
警报的调用,则会出现不同的情况控制台中的ent输出

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

// [> OtherObject]
如您所见,如果删除
警报
,控制台将输出

// [undefined × 1] 
这类事情要么是由于某种竞争条件,要么是由于
警报
功能引起的副作用。以下是我对幕后发生的事情的理论:

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

我仍然不能完全确定这是否真的发生了,但这似乎是合理的。我将进行更多的测试,以检查我的理论是否正确。

您正在哪个浏览器中测试此理论?您尝试过其他浏览器吗?您可能想再次检查该值是否确实不正确。它对我来说显示为空,这是错误的直到奇怪,直到我记得Chrome动态更新了一些console.log输出。因此,因为您稍后弹出,它正在更新打印的数组以显示为空。或其他。如果您执行console.log(this.bar.toString()),您是否看到该项?