Javascript 数组表示法

Javascript 数组表示法,javascript,jquery,jquery-select2,Javascript,Jquery,Jquery Select2,我想知道[]和(3)[对象,对象,对象]之间的数组表示有什么区别 我有一组对象,如: var array = [{id: 1, text: 'a'}, {id: 2, text: 'b'}, {id: 3, text: 'c'}]; 当我尝试在代码中的某一行中使用console.log(array)时,它有时打印为[],有时打印为(3)[对象,对象,对象]。[]不是空的,不过,当我在浏览器控制台上展开它时,两者都包含相同的值(3个对象) 在我的例子中,当我使用var数组作为我的select2的

我想知道
[]
(3)[对象,对象,对象]
之间的数组表示有什么区别

我有一组对象,如:

var array = [{id: 1, text: 'a'}, {id: 2, text: 'b'}, {id: 3, text: 'c'}];
当我尝试在代码中的某一行中使用
console.log(array)
时,它有时打印为
[]
,有时打印为
(3)[对象,对象,对象]
[]
不是空的,不过,当我在浏览器控制台上展开它时,两者都包含相同的值(3个对象)

在我的例子中,当我使用
var数组
作为我的
select2的数据时,如下所示:

$('#elems').select2({
      data: array
});
如果当i
console.log(array)
显示为
(3)[Object,Object,Object]
,则
选择2
获取数据,选项将是
a,b,c
。但是,当它显示为
[]
select2
时,无法读取对象,因此,该选项将为空

我想知道
select2
是否将
[]
读取为空,尽管在浏览器控制台上
[]
是可扩展的,并且包含值。像这样:

$('#elems').select2({
      data: array
});


有人能解释一下吗?这是个时间问题。console.log在添加项目之前运行。运行此代码段以获取示例。你必须把握好时机。很可能是比赛状态

var数组=[{id:1,text:'a'},{id:2,text:'b'},{id:3,text:'c'}];
console.log(数组);
var数组=[];
setTimeout(函数(){
push({id:1,文本:'a'},{id:2,文本:'b'},{id:3,文本:'c'});
}, 1000);

console.log(数组)JavaScript控制台中的单行显示是在调用
console.log()
时生成的

稍后单击箭头图标时,将在单击箭头时生成多行显示

这就是为什么您会看到两件不同的事情:您在最初的
console.log()
调用之后的某个时候更改了数组,但在单击箭头之前

如果要查看在调用
console.log()
时存在的完整数组内容,最好使用
JSON.stringify()

如果您不确定发生这种情况的原因,很可能是在进行原始的
console.log()
调用后,有一些异步操作修改了数组。例如,一个常见的错误是进行ajax调用以填充全局变量,然后在ajax调用返回后尝试立即在代码中使用该变量,但这是在数据准备就绪和调用ajax回调之前


在这种情况下,您根本不应该使用全局变量。相反,您应该在ajax回调本身中或在从该回调调用的函数中处理从服务器返回的数据。不要试图将其存储在全局变量中,也不要假设其他代码知道数据何时准备就绪。仅访问回调中的数据。

您是否单击了小的
i
图标?控制台不是标准化的,因此每个浏览器都可以自行决定数据的显示方式。@Xufox是的,两个浏览器都显示相同的消息
下面的值刚刚计算过。
无论浏览器是什么,当数组显示为
[]时,
select2
都会阻止读取
对象
我想知道这是否是某种比赛条件。在console.log运行时,它是一个空数组,但在渲染时,它有3个项目或类似的内容。@mkaatman这也是我的想法。然后,我再次尝试在我的代码中的一些行中随机放置
console.log
,一些显示为
[]
,而另一些则没有。我明白了,所以这是一个设置超时的计时问题1000毫秒。这与您为我描述的完全一样。