令人费解的javascript数组行为

时间:2009-07-30 13:58:02

标签: asp.net javascript visual-studio ajax arrays

所以,这可能是一个非常愚蠢的问题,但我显然在这里遗漏了一些东西。

请考虑以下代码:

    var selectedItems = [];
    selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
    //fyi, selectedItems[selectedItems.length] = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"; produced the same result.

最后selectedItems内容如下所示:

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String
   -  length      1                                        Long

但是如果我只是尝试在同一个字符串上调用split(),就像这样:

selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

现在我假设的数组的内容看起来像这样(缺少长度):

Name              Value                                    Type
-------------     --------------------------------------   ------
selectedItems     {...}                                    Object
   -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

知道有什么区别吗?这里到底发生了什么? 提前谢谢。

已更新: 我有一种感觉,实际上两个结果值在结构上有所不同,因为(atlas)当我尝试将它传递给服务器端的WebMethod时,ajax会在具有length属性的那个上窒息(没有实际的错误消息,但我知道呼叫失败)。我不确定。

更新#2 我注意到以这种方式设置targetLocationIdList,导致Quick Watch窗口中没有显示“length”属性:

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retVal.split(',')
  };

但是此结果包含快速监视窗口中显示的“长度”属性:

  var retValArr = [];
  retValArr = retVal.split(',');

  var params = 
  {
    jobId : args.get_JobId(), 
    targetLocationIdList : retValArr 
  };

7 个答案:

答案 0 :(得分:3)

在编程上没有任何区别。如果您在chrome开发人员窗口和firebug中运行示例,它看起来像第二个

 Name              Value               
 Type
 -------------     --------------------------------------   ------ 
 selectedItems     {...}                                    Object
    -  [0]         "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3"   String

长度是隐含属性

修改

var retVal = 'test';
var params = 
  {
    jobId : 1, 
    targetLocationIdList : retVal.split(',')
  }; 
console.log(params.targetLocationIdList.length) // prints 1

上面的代码在IE8,Firefox,Chrome(在他们的开发工具或firebug中)打印1,所以认为这必须是Visual Studio或Atlas以显示对象的方式的问题。

答案 1 :(得分:2)

这可能是调试器中的错误吗? (或者这是否会导致浏览器出现问题?)

答案 2 :(得分:2)

在第一个实例中,您将selectedItems声明为数组,然后分配给它。

在第二个实例中,您直接从split方法分配它。

我只能假设VS将数组声明作为显示长度属性的提示。

答案 3 :(得分:1)

看起来你在微软的Javascript实现中发现了一个缺陷。 Visual Studio和IE很可能共享相同的实现,这就是为什么你只是在这两个程序中遇到错误,而不是在Firefox或Chrome中。

在EMCAScript标准中:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf

15.5.4.14 String.prototype.split(分隔符,限制)
返回一个Array对象,其中存储了将此对象转换为字符串的结果的子字符串。

在Array Object的定义中:

15.4数组对象
...每个Array对象都有一个length属性,其值始终是非负整数 小于2 32

答案 4 :(得分:0)

您使用的是哪种浏览器,并且您确定没有length属性吗?我刚刚做了

var arr = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",")

在我的Firebug控制台中,arr的{​​{1}}属性确实等于1,正如预期的那样。

答案 5 :(得分:0)

你怎么知道电话失败了?确保以调试模式运行,或使用失败的处理程序通知原因。

答案 6 :(得分:0)

这是一个非常简单的测试:

var selectedItems = [];
selectedItems.push("0ce49e98-a8aa-46ad-bc25-3a49d475e9d3");
alert(selectedItems);
selectedItems = "0ce49e98-a8aa-46ad-bc25-3a49d475e9d3".split(",");
alert("boo");
alert(selectedItems.length);

嘘声之后,我们检查是否还有一个长度。

答案:是的。 换句话说,这是Visual Studio的错误,仅此而已。