数组表示

时间:2017-07-06 03:35:07

标签: javascript jquery jquery-select2

我想知道[](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是否将[]读为空,尽管在浏览器的控制台[]上可扩展且包含值。像这样:

enter image description here

任何人都可以解释一下吗?

2 个答案:

答案 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回调本身或在该回调中调用的函数中处理从服务器返回的数据。不要尝试将其存储在全局变量中,并且不要假设您的其他代码知道数据何时准备就绪。仅在回调中访问数据。