Javascript - 这个对象定义符号有什么区别?

时间:2011-02-26 08:05:06

标签: javascript jquery ajax post

我正在尝试将数组传递给jquery的 .ajax()函数的数据参数。第一种方法是我制作了这样的二维数组:

var arr = new Array();
for(i in someArray){
      arr[i] = new Array();
  arr[i].lon = "x";
  arr[i].lat = "y";
}

然后我尝试将其作为 $。ajax()中的数据传递:

$.ajax({
    data: { vals : arr },
    async: false,
    type: "POST",
    url: "namedb.php",
    dataType: "script",
    success: function(data){
      result = data;
      alert(result);
        }
});

test.php 只返回 $ _ POST 的所有值。所以 alert()返回:

Array
(
)

但是,如果我将代码更改为:

var arr = new Array();
for(i in someArray){
      arr[i] = new Array();
  arr[i] = { lon: "x", lat: "y" };
}

alert()会返回我的预期:

Array
(
    [vals] => Array
        (
            [0] => Array
                (
                    [lat] => "y",
                    [lon] => "x"
                )
            ...
        )
)

我知道两种方法都初始化 arr 的每个元素的变量/属性(或者我错了?)。但为什么2方法的表现不同? (对不起,我可以缩短我的问题,但我想我需要解释一下我是如何找到它的)。

编辑:我添加了初始化(arr [i] = new Array();)。我必须在编辑问题时删除它。但仍然是同样的问题。

3 个答案:

答案 0 :(得分:5)

那是因为你没有初始化数组元素。

var arr = new Array();
for(i in someArray){
  arr[i] = {}; // initialize it!
  arr[i].lon = "x";
  arr[i].lat = "y";
}

实际上,我更喜欢写

var arr = new Array();
for(i in someArray){
  arr[i] = { lon: "x", lat: "y" };
}

因为我不必输入arr[i] 3次。


在数组上使用for in循环是错误的,你应该使用for循环或jQuery的$.each

var arr = [];
for(var i = 0; i < someArray.length; i ++) {
  arr[i] = { lon: "x", lat: "y" };
}

或者

var arr = [];
$.each(someArray, function(i, value) {
  arr[i] = { lon: "x", lat: "y" };
});

使用Array.prototype.push向数组添加内容更容易,因为您不需要知道数组的下一个索引,也可以与arr[arr.length]=something进行比较。

var arr = [];
$.each(someArray, function(i, value) {
  arr.push({ lon: "x", lat: "y" });
});

现在你正在做的是从数组中收集数据并将其转换为另一个数组。 jQuery已经有了一个执行此操作的函数:$.map

var arr = $.map(someArray, function(value, i) {
  return { lon: "x", lat: "y" };
});

请注意,使用$.each时,参数为i, value,当您使用$.map时,它们会被切换。

答案 1 :(得分:1)

var arr = new Array();
for(i in someArray){
  arr[i].lon = "x";
  arr[i].lat = "y";
}

给出错误。因为对于任何 i ,arr [i]始终未定义

在第二种情况下,您正在创建一个新的对象并将其分配给arr [i]

答案 2 :(得分:0)

问题在于,在第一种方法中,在尝试设置其属性之前,不会将arr[i]初始化为对象。实际上,我认为您应该在调试控制台中收到JavaScript错误。以下方法可行:

var arr = new Array();
for(i in someArray){
  arr[i] = {}; // or "new Object()"
  arr[i].lon = "x";
  arr[i].lat = "y";
}

仅使用new Array()是不好的做法;最好使用var arr = []。同样,这就是我使用arr[i] = {}代替arr[i] = new Object()的原因。

编辑根据您的修改,您添加了行arr[i] = new Array()。好吧,数组没有lonlat属性,因此尝试设置它们将无效!您需要使用arr[i] = new Object()或(更好)arr[i] = {}。只有对象获得“expando属性”,您只需将内容分配给myObject.propertyName,并且该对象突然具有propertyName属性。