我知道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的全局变量,我没有修改原型
当然,这不应该影响新的数组声明吗?
答案 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()的时刻,但它是值的 对象在你点击它打开的那一刻。