javascript中奇怪的数组行为

时间:2018-04-15 04:52:45

标签: javascript arrays

我知道javascript中的数组与其他语言相比有点特殊,但我并没有真正得到这种行为,或者这里发生了什么。

我想知道它为什么会发生以及为什么我没有得到一个空数组:

function setupWindowProgBar(settings, window, palette, arr){
    console.log('start');
    console.log(arr);
    if(typeof arr == 'undefined'){
        var arr = [];
    }
    console.log(arr);
    console.log('stop');
    var arrLen = arr.length;
    arr[arr.length] = createProgBar('master', 'bg', window, 0, settings.fillColor, settings.strokeColor, settings.textColor, palette, 'percent', settings.reqType, settings.sourceType, settings.sourceTarget, settings.sourceId);
    return arr;
}

在控制台中生成:

start
undefined
[]
    0:
    barType:"master"
    bgcolor:"#12181f"
    curVal:160
        data:
        all_goals:160
        cost_hours:160
        cost_hours_spent:0
        cost_money:31610
        cost_money_owned:0
        parentObj:"progBar"
        progress_goals:5
        recurring:"no"
        wanted_timer:"2018-03-26 05:19:33"
        __proto__:Object
    fill:"#255f6f"
    height:59
    maxVal:5
    maxWidth:168
    sectionHeight:59
    stroke:"#7b9dac"
    text:"3%"
    textColor:"#dee5ed"
    textOpt:"percent"
    width:200
    x:33
    y:81
__proto__:Object
height:100
text:"omanko"
length:1
__proto__:Array(0)
stop

我确实在这里重新认识了这些对象,但据我所知,它不是来自全球污染 - console.log(window.arr)说没有名为arr的全局变量,我没有修改原型

当然,这不应该影响新的数组声明吗?

3 个答案:

答案 0 :(得分:2)

此行为不限于数组,任何对象在控制台中都以这种方式运行

您所看到的是所有浏览器中控制台的结果"撒谎"给你

如果您console.log(anyobject)并在控制台中检查该对象,您将看到的是当前anyobject - 而不是console.log执行时的内容



var obj = {}
console.log(obj);
obj.test = 1;

var arr = [1];
console.log(arr);
arr.push(2);




现在,如果您打开开发者控制台,点击对象,您将看到test:1

查看控制台中的数组 - 输出为[1] ...但是,单击您看到两个元素的数组

注意:chrome开发者控制台至少暗示它会对你说谎 - 如果你悬停(或点击,无法召回),那就是蓝色i ,经常不要使用Chrome浏览器,您会看到一条消息,显示所显示的值为evaluated just now

答案 1 :(得分:0)

arr已经是您的函数的参数,并且未定义。 var被提升,因此对于解释器,您当前的代码实际上看起来像:

function setupWindowProgBar(settings, window, palette, arr){
  var arr; // **does not reassign the parameter**
  console.log('start');
  console.log(arr);
  if(typeof arr == 'undefined'){
    arr = [];
  }
  console.log(arr);
  console.log('stop');
}

您永远不应该声明一个名称已经作用于您正在使用它的块/函数的变量。

如果arr实际在参数中未定义,那么它将被分配到arr = [];行上的数组,但至少在Chrome上,在您console.log 时,不一定要打印空数组。

console.log(arr);不一定会立即显示arr - 根据您的浏览器,它可能只会在您打开控制台之后在控制台中填充,此行之后运行:

arr[arr.length] = createProgBar('master', 'bg', window, ...

答案 2 :(得分:0)

问题是当你调用console.log(arr)时,它会在控制台中引入一个引用,当你“打开”它时,它会被解除引用(单击箭头),这样它就会显示稍后在代码中进行的更改。请改用console.table(arr)console.log(JSON.stringify(arr))

以下是MDN

的摘录
  

请注意,如果您在最新版本中记录对象   您在控制台上登录的Chrome和Firefox是一个参考   到对象,它不一定是对象的'值'   你调用console.log()的时刻,但它是值的   对象在你点击它打开的那一刻。