存在Javascript对象和访问属性的问题

存在Javascript对象和访问属性的问题,javascript,arrays,variables,object,Javascript,Arrays,Variables,Object,我有这样的想法: var test = {}; function blah() { test[2] = 'filled'; } blah(); // ! Hopefully confusion is now averted.. console.log(test); //result test -> 2:"filled" console.log(test[2]); //result undefined 我不明白为什么我在第二个实例中得到“未定义”,而根据第一个实例,该对象

我有这样的想法:

var test = {};

function blah() {
   test[2] = 'filled';
}

blah(); // ! Hopefully confusion is now averted..

console.log(test);
//result  test -> 2:"filled"

console.log(test[2]);
//result  undefined
我不明白为什么我在第二个实例中得到“未定义”,而根据第一个实例,该对象的属性显然存在

有人有什么想法吗

谢谢

好的,人们似乎对代码存在于什么上下文中感到困惑,为了清楚起见,我现在添加了对blah()的调用。但请参考Jeff B回复下的评论

以下是相关代码的示例,可以这样说:

mydb = ..... //gets created here with relevant credentials
var test = {};
mydb.transaction(
    function(transaction) {
     transaction.executeSql("select * from mytable;", [], function(transaction,result) { 
     var r = result.rows.item(0);
     test[2] = r.title;
}, errorHandler);
    });

    console.log(test);
    //result  test -> 2:"the title"

    console.log(test[2]);
    //result  undefined
@舞曲 您提到Javascript的单线程性给了我一个想法,我尝试了以下方法:

window.setTimeout(function(){ alert(test[2]); },2000);

成功了!我得到了要提醒的预期值。你能建议我如何在不使用上述“黑客”的情况下绕过这个问题吗?

因为你没有调用
blah()

此外,您还需要:

var test = [];
或:

编辑

我运行了以下代码:

mydb = openDatabase('note','','Example',1024);
var test = {};
mydb.transaction(
    function(transaction) {
     transaction.executeSql("select * from mytable;", [], function(transaction,result) { 
     var r = result.rows.item(0);
     test[2] = r.title;
}, errorHandler);
    });

    console.log(test);

    console.log(test[2]);
在Safari 4.0.5中

我得到以下信息:

Object
  No Properties

undefined
这就是我希望看到的。对象
test
在从
mydb.transaction
进行回调之前没有分配任何属性,并且由于Javascript是单线程的,因此在调用
console.log
之前不能分配任何属性


由于您得到的结果不同,您能概述一下您使用的浏览器和版本吗?

这显然是一个异步问题。设置测试[2]后让代码运行的最简单方法是将代码放在那里,或者使用另一个回调函数,在设置测试[2]后调用它。

您没有显示所有代码,或者您对第一个
控制台的结果撒了谎。log
。我不明白为什么您首先会得到
2:filled
(没有运行
blah()
)。没有。我只是在Firebug控制台中运行了它,然后在
console.log(test)之后添加了您的注释
不是真的,我之所以不显示所有代码,是因为明显的原因,但我可以向你保证,我并不是在谎报我第一次调用控制台的结果!@Newbie,在Firebug中运行该代码不会导致你所说的。我并不是说你在编造东西,只是你给出的示例代码不会重现问题您看到的em。实际上blah()确实会被调用。我应该提到这是与HTML 5客户端数据库相关的,blah()表示的函数会被自动调用!为了清楚起见,让我们假设'blah()'被调用。如果是这样,什么会导致意外响应?要测试的赋值很好。虽然使用对象似乎不太正常,但OP在使用数字成员名的对象时所做的操作并没有本质上的错误。嗯,当我使用
alert()添加
blah()
,对其进行测试时
我得到的不是
log()
,而是
[对象]
分别填充了
。@Dancrumb:考虑到他是如何访问数组的,我想我假设他想要一个数组。但是,是的,分配一个对象在技术上没有问题。完成了,请看上面!谢谢,我使用的是谷歌Chrome,版本:4.1.249.1045(42898)@Russell Leggett:我采用了您的第一个解决方案,我可能刚开始就应该这么做!我在代码中的其他地方使用了完全相同的构造,它工作得很好,没有任何问题,我猜代码在有问题的部分一定做了更多的处理,因此出现了异步问题!非常感谢所有响应在这个问题上,非常感谢!@Dancrumb:我仍然很想知道除了罗素·莱格特的建议之外,你还有什么其他的想法。
Object
  No Properties

undefined