两个变量1之间的差异被指定为未定义的值,第二个仅被声明为未初始化的var

时间:2015-09-08 04:52:25

标签: javascript undefined

两个variable之间有什么不同之处被分配了一个值undefined而第二个只有declared一个var未启动?

var a = undefined;
var b;
a === b;  // returns true 

两个变量ab之间有什么不同?

var ar = new Array(4); // ar = 0[undefined × 4]
ar[0] = null; // ar = [null, undefined × 3]
ar[1] = undefined; // ar = [null, undefined, undefined × 2]

ar.filter(function(item, index, arr){
  return item == undefined;
}); // [null, undefined]

我知道Array的过滤函数仅针对初始化索引运行。

javascript如何在内部检查ar[1]是否为undefined,以便为此运行过滤器,ar[2]未分配undefined,所以不要为此运行?

1 个答案:

答案 0 :(得分:1)

这里有三个独立的问题:

  1. 刚刚声明但未分配值的常规变量将在您读取该变量时报告undefined。这基本上是它的默认值。

  2. null==进行比较时,您必须非常小心,因为自动类型转换后您会发现null == undefinedtrue。因此,如果您只想过滤undefined元素,则必须在过滤器中使用item === undefined

  3. .filter()仅迭代数组中实际分配了值的元素。与普通变量不同,已分配值的数组元素与从未赋值的数组元素之间存在差异,.filter()知道跳过从未赋值的数组元素(基本上是"稀疏"。)

  4. 以下是关于这三个问题的更多细节:

    已声明但未显式初始化的变量的值为undefined。这是它的默认值。

    这个,这段代码符合预期:

    var a = undefined;
    var b;
    a === b;  // returns true 
    

    然后,在您的第二个代码块中,如果您想真正测试某些内容是否为undefined,那么您需要使用===,而不是==来避免任何类型转换。

    
    
    var ar = new Array(4); // ar = 0[undefined × 4]
    ar[0] = null; // ar = [null, undefined × 3]
    ar[1] = undefined; // ar = [null, undefined, undefined × 2]
    
    var result = ar.filter(function(item, index, arr){
      return item === undefined;
    }); 
    
    for (var i = 0; i < result.length; i++) {
       document.write(i, ": ", result[i], "<br>");
    }
    &#13;
    &#13;
    &#13;

    注意:.filter()将跳过尚未初始化为具有任何值的数组元素,因此在.filter()操作中甚至不会考虑它们。如果您尝试阅读其值,则会得到undefined,但.filter()知道&#34;稀疏&#34}之间的区别。从未分配任何内容的数组值。它与数组键是否存在有关,而不是数值是什么,因此它对于数组项而言与纯变量不同。

    来自MDN doc for .filter()

      

    filter()处理的元素范围在第一个之前设置   调用回调。之后附加到数组的元素   回调不会访问filter()开始的调用。如果   数组的现有元素被更改或删除,其值为   传递给回调将是filter()访问它们时的值;   不会访问已删除的元素

    这里演示了在将某些数据分配给数组元素之前数组键是如何实际存在的。这是.filter()用于了解要迭代的内容和要跳过的内容的信息:

    &#13;
    &#13;
    var ar = new Array(4);
    ar[1] = "foo";
    ar[2] = undefined;
    
    for (var index in ar) {
      document.write(index, ": ", ar[index], "<br>");     // 1 foo, 2 undefined
    }
    &#13;
    &#13;
    &#13;

    请注意,索引0和3不会使用for循环进行迭代,因为这些键在数组中不存在。数组是&#34;稀疏&#34;。实际上只存在一些元素。