【问题标题】:Problem with Javascript object and accessing property which existsJavascript对象和访问存在的属性问题
【发布时间】:2011-02-04 22:27:55
【问题描述】:

我有这样的事情:

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

@Dancrumb 你提到的 Javascript 的单线程给了我一个想法,我尝试了这个:

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

它成功了!我得到了警报的预期值。你能建议我如何在不使用上述“黑客”的情况下解决这个问题吗?

【问题讨论】:

  • 您没有显示所有代码,或者您在对第一个 console.log 的结果撒谎。
  • 我不明白你为什么首先得到2:filled(没有运行blah())。
  • 不。我刚刚在 Firebug 控制台中运行了它,您在 console.log(test) 之后的评论不正确
  • 出于显而易见的原因,我没有显示所有代码,但我可以向你保证,我不会对我第一次调用控制台的结果撒谎!
  • @Newbie,在 Firebug 中运行该代码不会产生您所说的结果。我并不是说您在编造,只是您提供的示例代码不会重现您所看到的问题。

标签: javascript arrays variables object


【解决方案1】:

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

【讨论】:

  • @Russell Leggett :我采用了您的第一个解决方案,我可能一开始就应该这样做!我在代码的其他地方使用了完全相同的构造,它运行良好,没有任何问题,猜测代码必须在有问题的部分进行更多处理,因此出现异步问题!
  • 非常感谢所有回复此问题的人,非常感谢! @Dancrumb:我仍然很想知道您是否有任何想法,而不是 Russell Leggett 提供的想法。
【解决方案2】:

编辑

我运行了以下代码:

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 之前不会发生。

既然你得到了不同的结果,你能概述一下你正在使用什么浏览器和什么版本吗?

【讨论】:

  • 完成,请看上面!谢谢
  • 您好,我使用的是谷歌浏览器,版本:4.1.249.1045 (42898)
【解决方案3】:

因为你没有打电话给blah()

另外,你想要:

var test = [];

或:

var test = new Array();

【讨论】:

  • 实际上 blah() 确实被调用了。我应该提到这与 HTML 5 客户端数据库有关,并且 blah() 表示的函数会被自动调用!因此,为了清楚起见,让我们假设“blah()”被调用。如果是这样,什么会导致意外响应?
  • 测试的分配很好。虽然使用对象似乎不正统,但 OP 在使用具有数字成员名称的对象方面所做的事情本身并没有什么不正确的。
  • 嗯,当我测试它时添加blah(),使用alert() 而不是log(),我分别得到[object Object]filled
  • @Dancrumb:我想我认为他想要一个数组,考虑到他是如何访问它的。但是,是的,分配对象在技术上没有任何问题。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2013-07-21
相关资源
最近更新 更多