Javascript未定义的对象值

Javascript未定义的对象值,javascript,undefined,Javascript,Undefined,我在关联数组值上遇到了一个未定义的错误,无法解释原因 var list = new Array(); function addNewElement(id, n) { var obj = new Object(); obj["id"] = id; obj["n"] = n; list.push(obj); } function exists(id) { for (var o in list) { if (o["id"] == id) {

我在关联数组值上遇到了一个未定义的错误,无法解释原因

var list = new Array();

function addNewElement(id, n) {
    var obj = new Object();
    obj["id"] = id;
    obj["n"] = n;
    list.push(obj);
}

function exists(id) {
    for (var o in list) {
        if (o["id"] == id) {
            return true;
        }
    }
    return false;
}
id是字符串,n是整数


In-exists o[“id”]为其中的每个对象返回未定义的值,但直接在对象创建后,这些值将通过obj[“id”]显示并可访问。

对于In循环,不仅循环添加的成员,而且循环存储在原型中的成员

要解决此问题,请执行以下操作:

if (o.hasOwnProperty("id") && o["id"] == id) { /* */ }

For-in循环不仅循环添加的成员,还循环存储在原型中的成员

要解决此问题,请执行以下操作:

if (o.hasOwnProperty("id") && o["id"] == id) { /* */ }

这不是JS for循环的工作方式。您的
o
变量将成为索引,而不是值。应该是:

if (list[o]["id"] == id) {
function exists(id) {
    for (var i = 0; i < list.length; i++) {
        if (list[i]["id"] == id) {
            return true;
        }
    }
    return false;
}
除了不应该在数组中为..in使用
,所以它应该是:

if (list[o]["id"] == id) {
function exists(id) {
    for (var i = 0; i < list.length; i++) {
        if (list[i]["id"] == id) {
            return true;
        }
    }
    return false;
}
函数存在(id){
对于(变量i=0;i
JS for循环不是这样工作的。您的
o
变量将成为索引,而不是值。应该是:

if (list[o]["id"] == id) {
function exists(id) {
    for (var i = 0; i < list.length; i++) {
        if (list[i]["id"] == id) {
            return true;
        }
    }
    return false;
}
除了不应该在数组中为..in
使用
,所以它应该是:

if (list[o]["id"] == id) {
function exists(id) {
    for (var i = 0; i < list.length; i++) {
        if (list[i]["id"] == id) {
            return true;
        }
    }
    return false;
}
函数存在(id){
对于(变量i=0;i
下面是非常棒的代码片段:

下面是非常棒的代码片段:


Hm,你能帮我解释一下为什么JS不像其他语言那样使用数组吗?(数组[index]是访问数组的正常方式吗?)是的,
arrayName[index]
是JS所做的。当你在评论中说
Array[index]
时,
Array
将是你的
list
变量,
o
将是
索引
,因此
list[o]
如我的回答中所示,将获得该数组位置的对象和
list[o][id][/code>(或
list[o].id
)获取位于该数组位置的对象的属性。仅供参考:.Aw我明白了,但如果您来自Java,那么这是一种非常不直观的行为,其中For(Object o:list)使用迭代器并以o形式返回实际对象,允许直接访问。因此,.in的JavaScript与C++中的迭代器有些类似。在
o
中获得实际对象时,有一个数组的行为与您期望的方式相同,但如果您希望在找到匹配值后立即从包含函数中返回,则使用该数组会更加笨拙。另外,如果您需要密钥名和相关值,那么JS
for..in
也很方便-它不适用于数组。嗯,您能给我链接一个解释,说明为什么JS不像几乎所有其他语言那样使用数组吗?(数组[index]是访问数组的正常方式吗?)是的,
arrayName[index]
是JS所做的。当你在评论中说
Array[index]
时,
Array
将是你的
list
变量,
o
将是
索引
,因此
list[o]
如我的回答中所示,将获得该数组位置的对象和
list[o][id][/code>(或
list[o].id
)获取位于该数组位置的对象的属性。仅供参考:.Aw我明白了,但如果您来自Java,那么这是一种非常不直观的行为,其中For(Object o:list)使用迭代器并以o形式返回实际对象,允许直接访问。因此,.in的JavaScript与C++中的迭代器有些类似。在
o
中获得实际对象时,有一个数组的行为与您期望的方式相同,但如果您希望在找到匹配值后立即从包含函数中返回,则使用该数组会更加笨拙。另外,如果您需要键名和相关值,那么JS
for..in
也很方便-它不适用于数组。好吧,我不知道-这让我想知道为什么我应该使用for..in?在这种情况下,我只是坚持好旧的循环,而不是!事实上,
中的
包含继承属性与问题的起因无关。使用
o.hasOwnProperty()
无法修复任何问题,因为
o
是一个字符串。是的,但很高兴知道-问题仍然是这样。对象存在,但o[“id”]的内容未定义,就好像我从未创建键值一样!在循环的第一次迭代中,
o
将是字符串
“0”
,第一个数组元素的索引。它将不是存储在该索引中的对象。在第二次迭代中,
o
将是
“1”
,第二个索引。好吧,我不知道这一点-让我想知道为什么我应该使用..in?在这种情况下,我只是坚持好旧的循环,而不是!事实上,
中的
包含继承属性与问题的起因无关。使用
o.hasOwnProperty()
无法修复任何问题,因为
o
是一个字符串。是的,但很高兴知道-问题仍然是这样。对象存在,但o[“id”]的内容未定义,就好像我从未创建键值一样!在循环的第一次迭代中,
o
将是字符串
“0”
,第一个数组元素的索引。它将不是存储在该索引中的对象。在第二次迭代中,
o
将是第二个索引
“1”
。这不是数组的适当用法,尽管它可以工作,因为数组是对象的一种类型。在您的代码中,
list
应该是一个普通对象,如
var list={}。(请注意,当我说“它有效”时,它实际上并没有像OP尝试的那样创建一个具有
id
n
属性的对象列表。而且
list[key]==undefined
有点不精确:如果已经创建了一个具有指定键的属性,但其值是
undefined
null该怎么办