我有一个像:
这样的数组 errors = [ {...}, {...}, {...} ]
这是一个instanceof
数组,但它只为.length
返回1?
相关代码:
if(data.error){
errors.push({'element':ele,error:data.error});
}
//Above is looped a few times and there are N number of errors now inside
console.log(errors) //Returns 2+ objects like {...}, {...}
console.log(errors.length) //Returns 1
对于Uzi和Muirbot,这里是错误数组:
[
Object
element: b.fn.b.init[1]
error: "You must enter "example" into the field to pass"
__proto__: Object
,
Object
element: b.fn.b.init[1]
error: "Crap!"
__proto__: Object
答案 0 :(得分:0)
这是正确的,这段代码:
var errors = new Array();
errors.push({'element':'ele', error:'data.error'});
...将一个对象添加到数组中。该对象有两个属性。
答案 1 :(得分:0)
您的代码可能按照您期望的顺序执行。即,当您同时记录errors
和errors.length
时,errors
只包含一个对象。但之后你要添加到errors
数组,只有在那之后才能看到控制台。此时,您可以在errors
中看到更大的数组,原因有二:首先,您的实际代码不会记录errors
,而是包含errors
的某个对象。在这种情况下,控制台显示是实时的,并且不会显示当时errors
中的内容,而是现在的内容。或者,控制台可能只需要一些时间来记录errors
。
如果没有更多代码,我无法确定是否是这种情况。但您可以将console.log(errors);
替换为console.log(errors[1]);
来验证它。如果当时错误实际上只有1个,则会记录undefined
。
答案 2 :(得分:0)
问题在于Chrome的Web Inspector的console.log是一个异步事件。因此,长度是一个属性查找,所以它立即返回,但内部有两个项目的对象被推迟,直到其余的事件被触发。
将来我和其他有此问题的人应该使用debugger;
代替。
答案 3 :(得分:-1)
是一个Array对象还是类似于它的东西?
数组有效:
> a = [{a:1}, {b:2}] [Object, Object] > a.length 2
你必须提供更多代码。
现在你已经提供了相关的代码,正确的答案是what Steve Wellens said(顺便说一句,这个答案是低估的。)
Array.push添加了一个元素,对象可能有多个键,但它们仍然是一个对象,因此您的实际案例与原始示例不同,这当然有效。
另一种可能性:
> a = []
[]
> a.length = 2
2
> a
[]
> a.length
2
> a instanceof Array
true