繁体   English   中英

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

[英]Javascript - What's the difference with this object definiton notations?

我试图将数组传递给jquery的.ajax()函数的data参数。 第一种方法是使我的二维数组如下所示:

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的每个元素的变量/属性(或者我错了吗?)。 但是,为什么两种方法的行为有所不同? (对不起,我可以缩短我的问题,但是我想我需要解释一下我是如何找到它的)。

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

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

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 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 ,它们将被切换。

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

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

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

问题在于,在第一种方法中,您没有在尝试设置对象的属性之前将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] = {} 只有对象获得“扩展属性”,在这里您只是将内容分配给myObject.propertyName ,而对象突然具有propertyName属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM