【问题标题】:Object inside of array -- works in one scope but not in another?数组内的对象——在一个范围内工作,但在另一个范围内不工作?
【发布时间】:2010-06-10 01:13:14
【问题描述】:

好的,我一直在学习 Javascript 的一些更高级的方面,现在尝试使用它我被卡住了。

这是我的代码:

function Data(){}

function init(state){
  var item;
  item=new Data();
  item.fieldrid=17;
  item.description='foo';
  state.push(item);
};


function findInState(state,fieldrid) {
    for (var item in state) {
        alert(item.fieldrid); //prints undefined
        if (item.fieldrid == fieldrid) {
            return item;
        }
    }
    return null;
}

var s=[];
init(s);
alert(s[0].fieldrid); //prints 17 (expected)
alert(findInState(s,17).fieldrid); //exception here. function returns null.

一个运行的例子是here at jsbin

为什么这不起作用?我希望findInState 中的警报会产生 17,但它会产生未定义的结果。

我做错了什么?

【问题讨论】:

    标签: javascript arrays object


    【解决方案1】:
    for (var item in state)
    

    您不应使用 for..in 循环遍历数组。
    使用for (var i = 0; i < state.length; i++) 时,它按预期工作。

    https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in:

    虽然将其用作迭代数组的方法可能很诱人,但这是个坏主意。

    【讨论】:

    • 其实你可以遍历它,var item 然后只保存数组索引。然后,您应该在 for 块的剩余部分中使用 state[item] 而不是 item。不用说,这确实不是循环数组的首选方式:)
    • @balus 那么“首选方式”是什么?除了 C 风格 for(;;) 语法之外,我还缺少一些捷径吗?
    • @Earlz 不,for(;;) 首选方式。
    • 使用for(;;)for in 可能返回数组索引以外的其他属性,并且迭代顺序是任意的。你需要做额外的检查。另请参阅答案中的链接,描述章节底部有一整段。
    • @Earlz:另请参阅 this answer 我之前发布的更多详细信息,说明为什么应该避免 for-in 使用类似数组的对象...
    【解决方案2】:

    alert(item.fieldrid); //prints undefined
    

    您需要访问数组 state[item] 所以在该行之前,添加

    item = state[item];
    

    我想,我会的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多