javascript中奇怪的数组行为
我知道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 = [];
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
<代码>测试
不是什么特别的东西