我想知道[]
和(3) [Object,Object,Object]
之间数组表示的区别是什么?
我有一些对象,如:
var array = [{id: 1, text: 'a'}, {id: 2, text: 'b'}, {id: 3, text: 'c'}];
当我在代码中的某一行尝试console.log(array)
时,有时会将其打印为[]
,有时打印为(3) [Object,Object,Object]
。 []
不是空的,但是当我在浏览器的控制台上展开时,它们都包含相同的值(3个对象)。
在我的情况下,当我使用var array
作为select2
的数据时,这样:
$('#elems').select2({
data: array
});
如果,当我console.log(array)
并且显示为(3) [Object, Object, Object]
时,select2
获取数据,选项将为a,b,c
。但是,当它显示为[]
select2
无法读取对象时,该选项将为空。
我想知道select2
是否将[]
读为空,尽管在浏览器的控制台[]
上可扩展且包含值。像这样:
任何人都可以解释一下吗?
答案 0 :(得分:3)
这是一个时间问题。 console.log在添加项目之前运行。运行此代码段以获取示例。你必须恰到好处才能达到时机。最有可能是竞争条件。
var array = [{id: 1, text: 'a'}, {id: 2, text: 'b'}, {id: 3, text: 'c'}];
console.log(array);
var array = [];
setTimeout(function(){
array.push({id: 1, text: 'a'}, {id: 2, text: 'b'}, {id: 3, text: 'c'});
}, 1000);
console.log(array);
答案 1 :(得分:2)
在您调用console.log()
时,会生成JavaScript控制台中的单行显示。
稍后单击箭头图标时,单击箭头时会生成的多行显示。
这就是为什么你会看到两件不同的事情:你在原来的console.log()
电话之后但在你点击箭头之前的某个时候更改了数组。
如果您希望在console.log()
电话会议时看到完整的数组内容,那么最好使用JSON.stringify()
:
console.log( JSON.stringify( array, null, 4 ) );
如果您不确定为什么会发生这种情况,可能的一个原因是您进行了一些异步操作,在您进行原始console.log()
调用后修改了数组。例如,一个常见的错误是进行ajax调用以填充全局变量,然后在ajax调用返回后尝试立即在代码中使用该变量 - 但这是之前数据是ready和ajax回调被调用。
在这种情况下,您根本不应该使用全局变量。相反,您应该在ajax回调本身或在该回调中调用的函数中处理从服务器返回的数据。不要尝试将其存储在全局变量中,并且不要假设您的其他代码知道数据何时准备就绪。仅在回调中访问数据。