javascript中奇怪的数组行为

javascript中奇怪的数组行为,javascript,arrays,Javascript,Arrays,我知道javascript中的数组与其他语言相比有点特殊,但我并不真正了解这种行为,或者这里发生了什么 我想知道为什么会发生这种情况,为什么我没有得到一个空数组: function setupWindowProgBar(settings, window, palette, arr){ console.log('start'); console.log(arr); if(typeof arr == 'undefined'){ var arr = [];

我知道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的全局变量,我也没有修改原型

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

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
it
时,不一定会打印空数组

console.log(arr)
不一定会立即显示
arr
-根据您的浏览器,只有在您打开控制台并运行此行后,才能在控制台中填充该命令:

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

问题是,当您调用
console.log(arr)
时,它会在控制台中放置一个数组引用,当您“打开”它时(单击箭头),该数组将被取消引用,因此它将显示稍后在代码中所做的更改。使用
console.table(arr)
console.log(JSON.stringify(arr))

下面是来自

请注意,如果您在最新版本的中记录对象 Chrome和Firefox您在控制台上登录的内容是一个参考 对于对象,它不一定是当前对象的“值” 调用console.log()的时刻,但它是 在单击对象时将其打开


这种行为并不局限于数组,任何对象在控制台中都是这样的

您看到的是所有浏览器中的控制台对您“撒谎”的结果

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

var obj={}
控制台日志(obj);
obj.test=1;
var-arr=[1];
控制台日志(arr);

arr.push(2)
不应该发生这种情况,因为
arr
在记录时应该是一个空数组,而不是一个奇怪的对象。我肯定你忽略了代码中的关键部分。我同意,这不应该发生-将为Clarity添加整个函数。这对我来说毫无意义。不,@Tigger它是一个数组,我想知道的是为什么arr[0]中填充了嵌套对象。如果不是来自全球范围,那么这种污染是从哪里来的?只是一个简单的后续问题,第一个console.log(arr)是如何产生的;在if语句返回“undefined”之前?@DanielBengtsson正是我想知道的。第一个
console.log(arr)
打印
undefined
arr已经是函数的一个参数,它不是未定义的
如果是呢?i、 e.使用
setupWindowProgBar(设置、窗口、调色板)调用
i添加了这个:console.log('test');在if语句中-它确实运行。@Ooops,missread-是的,您是正确的-有时是正确的。我知道逻辑是混乱的,我现在正在重构代码,修复它没有问题-我对它发生的原因更感兴趣,所以我知道如何在将来使用/避免它。我猜这就是答案。但我在Chrome中看到了另一个奇怪的行为<代码>var obj;控制台日志(obj);obj={test:1}
此代码打印未定义的对象,而不是obj的当前值Yes,因为它是
未定义的
-并且分配了一个新对象,因此
控制台
将不会“稍后”显示此新对象-因此,在allAh,这一点实际上并不奇怪!可以知道了。如果我写
var obj={};控制台日志(obj);obj.a=2,我猜它可能是在维护对obj对象的引用,并输出该对象的当前值。是的,这正是我发布的代码,除了您使用了名为
a
的属性和我使用的
test
<代码>测试
不是什么特别的东西