代码之家  ›  专栏  ›  技术社区  ›  Kon

令人费解的javascript数组行为

  •  3
  • Kon  · 技术社区  · 17 年前

    考虑下面的代码:

        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
    


    提前谢谢。

    :

    更新#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 回复  |  直到 17 年前
        1
  •  3
  •   AutomatedTester    17 年前

    在编程上根本没有区别。如果你同时在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在显示对象的方式上的问题。

        2
  •  2
  •   edeverett    17 年前

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

        3
  •  2
  •   Oded    17 年前

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

    在第二个实例中,您直接从split方法为其赋值。

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

        4
  •  1
  •   William    17 年前

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

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

    15.5.4.14串、原型、拆分(分隔符、限位)

    在数组对象的定义中:

    15.4阵列对象
    少于2 32 .
        5
  •  0
  •   Vinay Sajip    17 年前

    length 所有物我就这么做了

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

    在我的Firebug控制台中 arr 有一个 属性等于1,如预期的那样。

        6
  •  0
  •   InfinitiesLoop    17 年前

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

        7
  •  0
  •   KdgDev    17 年前

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

    boo之后,我们检查是否还有长度。

    回答:是的。 换句话说,这是VisualStudio的一个错误,仅此而已。