【问题标题】:What is "undefined x 1" in JavaScript?JavaScript 中的“未定义 x 1”是什么?
【发布时间】:2017-12-26 02:21:30
【问题描述】:

我正在基于this blog entry做一些小实验。

我正在 Google Chrome 的调试器中进行这项研究,困难的部分来了。

我知道我不能删除局部变量(因为它们不是对象属性)。我知道我可以从名为“arguments”的数组中“读出”传递给函数的所有参数。我什至知道我无法删除数组的元素,只能实现 array[0] 的值为 undefined。

有人可以向我解释一下 undefined x 1 在嵌入图像上的含义吗?

当我覆盖函数 foo 以返回 arguments[0] 时,我得到了通常和“正常”的未定义。

这只是一个实验,但看起来很有趣,有人知道undefined x 1指的是什么吗?

【问题讨论】:

  • 从技术上讲,您处理的不是Array,而是类似数组的Object
  • 请注意arguments 不是一个数组,而是一个Arguments 对象(尽管它看起来和行为相似)。此外,delete 运算符不能从数组中删除项目。
  • @alex:是的,我知道那个,这就是为什么我“能够”删除但只有对值的引用,对吧?否则数组的长度会短一。
  • @Bergi:当你创建一个临时数组并在那里克隆想要的元素跳过不需要的元素时,你是在说那个方法吗?还是你有别的想法?
  • 您正在寻找过滤方法?您应该使用 for(var i

标签: javascript arrays oop arguments


【解决方案1】:

这似乎是 Chrome 在数组(和 类数组 对象)中显示未初始化索引的新方法:

> Array(100)
[undefined × 100]

这肯定比打印[undefined, undefined, undefined,...] 或以前的打印效果更好。

虽然,如果只有一个 undefined 值,他们可以删除 x 1

【讨论】:

  • 哦,虽然我已经把手伸进了一些我不应该做的事情中...... =D 好的,thanx mate,+1,接受! =D
  • 不错的一个。似乎只适用于 implicit undefineds,例如new Array(100) 调用它,但 [undefined, undefined] 没有
  • @alex:是的,在这种情况下,索引01 实际上存在于数组中。稍微改变了我的回答措辞。
  • 我的数组就像 var e = [a(b), a(c), a(d)] chrome 显示 undefined x 3 如果我访问它 (e[0]) 它显示正确的类型。
  • @FelixKling 它发生在我使用星星的寻路中。只是第一个 console.log(open) 是 [undefined x xx] 而第二个 console.log(open[0]) 是正确的类型。我不知道为什么会这样。我无法提供示例,因为我无法让这种行为在任何其他代码上起作用,而且我不想显示我的代码......所以不,我不能。不过谢谢你的回答。
【解决方案2】:

较新版本的 Chrome 使用 empty 而不是 undefined 以使区别更加清晰。

例如,在 DevTools 控制台中输入 [,,undefined,,] 会导致:

▼(4) [empty × 2, undefined, empty]
   2: undefined
   length: 4
  ▶__proto__: Array(0)

【讨论】:

    【解决方案3】:

    Google Chrome 似乎选择使用 undefined x n 表示法显示 sparse array。如果不是稀疏数组,它将显示[undefined, undefined]

    var arr = new Array(2);
    console.log(arr);
    
    var arr2 = [];
    arr2[3] = 123;
    console.log(arr2);
    
    var arr3 = [,,,];
    console.log(arr3)
    
    var arr4 = [,];
    console.log(arr4)
    
    var arr5 = [undefined, undefined]
    console.log(arr5)
    
    var arr6 = [undefined]
    console.log(arr6)
    

    arr1 到 arr4 都是稀疏数组,而 arr5 和 arr6 则不是。 Chrome 会将它们显示为:

    [undefined × 2] 
    [undefined × 3, 123] 
    [undefined × 3] 
    [undefined × 1] 
    [undefined, undefined] 
    [undefined] 
    

    注意稀疏数组的[undefined x 1]

    由于您删除了一个元素,因此:If you delete an element from an array, the array becomes sparse.

    【讨论】:

      【解决方案4】:

      这是它的外观,将此代码键入 chrome devtools 控制台:-

      arr = new Array(4);
      arr[2] = "adf";
      console.log(arr);    // [undefined × 2, "adf", undefined × 1]
      

      查看*2表示的前两个连续的“未定义”,表明那里有两个连续的未定义

      【讨论】:

        【解决方案5】:

        这也发生在我身上。在另一个浏览器中打开相同的内容并将数组输出/记录到控制台。只要它在 crome 和 Firefox 中都以相同的方式工作(因为即使输出具有 undefinedx1,访问元素也能正常工作),我认为它是 Chrome 中的某种错误,不会在内部刷新某些内容。您实际上可以通过这种方式对其进行测试:

        1. 我正在向数组中添加元素,并触发 console.log() 来记录元素,以检查它是否未定义。它们都被定义了。

        2. 在 push() 之后,我记录了数组,似乎发生这种情况时,它始终是 Chrome 上未定义 x 1 的最后一个。

        3. 然后我尝试记录它更多次,也更晚一些,但结果相同。

        4. 但是,当我(为了输出)通过索引访问元素时,它返回了正确的值(有趣)。

        5. 之后我再次记录了数组,它说最后一个索引是未定义 x 1(我刚刚成功访问的那个索引!)。

        6. 然后我在数组上做了一个 for 循环,记录或使用每个元素,一切都很好。

        7. 然后在阵列上另一个日志,仍然有问题。

          我最初使用的代码检查了 undefined 并且它们没有触发,但是我在控制台中看到了所有这些 un​​defined 并且它困扰着我(不是双关语)。

        还值得一读:Unitialized variables in an array when using only Array.push? 我也在我的代码中使用了 pop(),这是一个合理的解释,即控制台日志实际上代表了不同的时间状态(当代码“停止”时)。

        【讨论】:

          猜你喜欢
          • 2011-06-22
          • 1970-01-01
          • 2013-01-15
          • 2015-07-05
          • 2011-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多