Javascript 数组中的对象--在一个作用域中工作,但在另一个作用域中不工作?

Javascript 数组中的对象--在一个作用域中工作,但在另一个作用域中不工作?,javascript,arrays,object,Javascript,Arrays,Object,好的,我一直在学习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

好的,我一直在学习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.
一个正在运行的示例是

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

我做错了什么

for (var item in state)
您不应该在中使用
for..在数组上循环
当使用(var i=0;i时,它可以正常工作

见:

虽然使用它作为迭代数组的一种方式可能很有诱惑力,但这不是一个好主意

您不应该在
中使用
for..在数组上循环
当使用(var i=0;i时,它可以正常工作

见:

虽然使用它作为迭代数组的一种方式可能很有诱惑力,但这不是一个好主意

您需要访问数组状态[item],因此在该行之前,请预先结束

item = state[item];
我想,我会的。

您需要访问数组状态[item],因此在该行之前,请预先结束

item = state[item];

我想,我会的。

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