Javascript中对象创建的异常行为
我无法通过此代码获得预期值,请帮助我识别此代码中的错误。我是java脚本的新手,我怀疑问题可能是由于对象创建或对象范围造成的。我用几种方法调试了它,但无法确定问题所在 另外,请告诉我我正在创建的数据是否为JSON格式。如果不是,那么等效的JSON格式是什么Javascript中对象创建的异常行为,javascript,arrays,json,object,push,Javascript,Arrays,Json,Object,Push,我无法通过此代码获得预期值,请帮助我识别此代码中的错误。我是java脚本的新手,我怀疑问题可能是由于对象创建或对象范围造成的。我用几种方法调试了它,但无法确定问题所在 另外,请告诉我我正在创建的数据是否为JSON格式。如果不是,那么等效的JSON格式是什么 PS.id = -1; PS.data = { formData:[] }; PS.setDef = []; PS.item = {}; if(cond){ PS.item.Name = "From"; PS.item.Type
PS.id = -1;
PS.data = {
formData:[]
};
PS.setDef = [];
PS.item = {};
if(cond){
PS.item.Name = "From";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);
PS.item.Name = "To";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[1].Name);
}//here alerts are coming properly. getting 'from' and 'to' in alerts
PS.data.formData.push({"id":id++, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":id++, "setDef":[PS.setDef[1]]});
//expected id 0
alert(PS.data.formData[0].id);
//expected name 'from'
alert(PS.data.formData[1].setDef[0].Name);
//expected id 1
alert(PS.data.formData[1].id);
//expected name 'to'
alert(PS.data.formData[1].setDef[1].Name);
我得到的不是0和1作为ID,名称作为“from”和“to”,而是以下值
-1
0
to
to
更新1:此处PS表示已声明的页面范围,已编辑警报以打印变量。此处有两件事。
首先,对于id,将代码更改为:
PS.data.formData.push({"id":++PS.id, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":++PS.id, "setDef":[PS.setDef[1]]});
由于在将id++分配给id时,id以-1开头,它首先分配id中当前的值,然后增加id的值,因此得到-1和0
其次,当您推PS.item时,实际上是将引用传递给对象,而不是实际对象。因此,当您更新PS.item的值时,它会反映在两个位置。尝试创建一个新对象并推送它,而不是覆盖旧对象
使用
PS.item={}代码>在指定值之前创建新对象。这应该行得通。您在代码的这一部分中只引用了PS.item两次:
PS.item.Name = "From";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);
//changing the value of PS.item
PS.item.Name = "To";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[1].Name);
您可以这样更改代码,并对结果感到满意:
//creating first instance
PS.item = {};
PS.item.Name = "From";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[0].Name);
//creating the second instance
PS.item = {};
PS.item.Name = "To";
PS.item.Type = "STRING";
PS.setDef.push(PS.item);
alert(PS.setDef[1].Name);
明白了吗?您的代码有几个逻辑错误和一个打字错误。这是已更正的版本(更改已在注释中标记为**此处**
)
您的PS
声明在哪里?您正在alert
ingstrings
而不是变量的值。执行PS.data.formData.push({“id”:id++,“setDef”:[PS.setDef[0]})时也是如此代码>id变量以前没有定义过。感谢您的回答,请您发布代码以创建新对象。我知道对象创建的构造函数方式,但在这里,由于我必须使用PS范围,我感到震惊。提前谢谢。谢谢@Sinax,问题解决了。你能澄清我关于json格式问题的第二部分吗?很抱歉,我在你的代码片段中找不到json部分。您正在创建和填充一些对象和数组,稍后可以在一次调用中使用JSON.stringify方法将它们转换为JSON格式,这样您就没有任何循环引用了。谢谢您的时间。理解我的错误,问题解决了。你能解释一下我问题的第二部分,关于JSON格式吗?要求将此数据转换为JSON格式,并使用DWR发送到后端,并使用Java在后端处理此数据。我对方法参数的语法感到困惑。例如像getJsonData(Map)一样,getJsonData(Map[])在java中表示上述数据格式的语法是否正确?@user3131769:对不起,我不知道java泛型(在他们尝试引入java之前,我放弃了java)。我想说的是,没有一种静态类型不是基于泛型“值”类型(可以是null、字符串、数字、数组或对象,其中数组和对象包含泛型值)的,但是能够表示泛型JSON消息的解析。
PS.id = -1;
PS.data = {
formData:[]
};
PS.setDef = [];
if(cond){
// *** HERE ***
// Your code was creating just one object instance in
// PS.item, pushing it, mutating and pushing it again
// The "alert" call was apparently correct just because
// it was done before mutating the object. Just moving
// both alerts at the end would have shown the problem.
PS.setDef.push({Name: "From", Type: "STRING"});
alert(PS.setDef[0].Name);
PS.setDef.push({Name: "To", Type: "STRING"});
alert(PS.setDef[1].Name);
}
// **HERE**
// id++ increments a value but returns the value BEFORE the increment.
// Thus formData[0] is expected to have .id == -1, not 0.
// If you want the value AFTER the increment then use ++id.
PS.data.formData.push({"id":++id, "setDef":[PS.setDef[0]]});
PS.data.formData.push({"id":++id, "setDef":[PS.setDef[1]]});
//expected id 0
alert(PS.data.formData[0].id);
//expected name 'from'
// *** HERE ***
// In the original code there is a typo (formData[1] instead of formData[0])
alert(PS.data.formData[0].setDef[0].Name);
//expected id 1
alert(PS.data.formData[1].id);
//expected name 'to'
alert(PS.data.formData[1].setDef[1].Name);