【问题标题】:What is the difference between [undefined] and [,]? [duplicate][未定义] 和 [,] 有什么区别? [复制]
【发布时间】:2012-08-02 06:47:12
【问题描述】:

可能重复:
What is “undefined x 1” in JavaScript?

在 Chrome 21 中,将 [,] 提供给控制台输出

[未定义 x 1]

并提供[undefined] 输出

[未定义]

[undefined][undefined x 1] 有什么区别?

[undefined x 1] 的符号是什么?

【问题讨论】:

  • 我相信,你需要阅读这个link
  • 控制台输出不是数据,也不是 (必然) JavaScript 符号或语法。它是控制台开发人员决定的数据的可视化表示。有时它很有帮助,有时可能会造成混淆或误导。

标签: javascript


【解决方案1】:

看起来这只是显示重复的“未定义”值的一种简写方式。例如:

> [,,,]
  [ undefined x 3 ]

但是[][undefined] 完全不一样。如果我是你,我会仔细检查。

【讨论】:

  • 请重新阅读我的问题。我问的是[,],而不是[]
  • 对 pimvdb 编辑的解释:es5.github.com/#x11.1.4,“如果在数组末尾省略了一个元素,则该元素不会影响数组的长度。”
  • @Randomblue 好吧,因为你编辑了它.. :-\
  • @nickf:标题(正确)未编辑。而将[,] 替换为[] 的问题并没有真正的意义。
【解决方案2】:

[,] 是一个sparse array。它的长度为 1,但没有值 (0 in [,] === false)。也可以写成new Array(1)

[undefined] 是一个长度为1 的数组,其值为undefined,位于索引0

访问属性“0”时,两者都将返回undefined - 第一个是因为该属性未定义,第二个是因为该值是“未定义”。但是,数组不同,它们的output in the console 也不同。

【讨论】:

    【解决方案3】:

    这很奇怪 [] 在 Chrome 21 上再次为我输出 []

    无论如何[a, b, c, ...] 是 Javascript 的数组表示法,所以你基本上是在定义一个没有值的数组。

    不过,结尾 , 是可以接受的,这样可以更轻松地生成数组。所以 Chrome 告诉你的是数组中有一个未定义的值。示例见代码。

    [,,]
    > [undefined x2]
    [1,2,]
    > [1, 2]
    [1,2,,]
    > [1, 2, undefined × 1]
    [1,2,,,]
    > [1, 2, undefined × 2]
    [1,2,,3,4,,,6]
    > [1, 2, undefined × 1, 3, 4, undefined × 2, 6]
    

    【讨论】:

    • 这些值是未定义的,因为它们不存在;它们未设置为undefined。 JavaScript 可以完美地处理这样的数组。
    • 这是undefined的定义。究竟是什么问题?
    • 问题是措辞不是很准确。如果您不介意,我已编辑。
    • 问题是,描述一些不是的东西总是会有很多可能的观点来看待文本......我添加了一个额外的例子,应该很清楚我的意思;)
    【解决方案4】:

    [,] 创建一个长度为 1 且没有索引的数组。

    [undefined] 在索引 0 处创建一个长度为 1 且具有 undefined 值的数组。

    Chrome 的 undefined × x 用于没有顺序索引的稀疏数组:

    var a = [];
    
    a[8] = void 0; //set the 8th index to undefined, this will make the array's length to be 9 as specified. The array is sparse
    console.log(a) //Logs undefined × 8, undefined, which means there are 8 missing indices and then a value `undefined`
    

    如果您要在稀疏数组上使用 .forEach,它会跳过不存在的索引。

    a.forEach(function() {
        console.log(true); //Only logs one true even though the array's length is 9
    });
    

    就像你做一个普​​通的基于.length的循环一样:

    for (var i = 0; i < a.length; ++i) {
        console.log(true); //will of course log 9 times because it's only .length based
    }
    

    如果您希望 .forEach 的行为与非标准实现相同,则存在问题。

    new Array(50).forEach( function() {
        //Not called, the array doesn't have any indices
    });
    
    $.each( new Array(50), function() {
        //Typical custom implementation calls this 50 times
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2018-10-23
      • 2015-11-23
      • 2013-02-13
      • 2011-04-26
      • 2016-09-24
      相关资源
      最近更新 更多