2017-07-06 29 views
3

我想知道[](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

任何人都可以瞭解這個解釋?

+1

你點了小'我'圖標?控制檯不是標準化的,因此每個瀏覽器都可以自行決定如何顯示數據。 – Xufox

+0

@Xufox是啊,都顯示相同的消息'值低於評價只是now.'不管瀏覽器,防止東西從''讀object' select2'當陣列顯示爲'[]' – procatmer

+0

我不知道是否是某種形式的的競賽條件。在console.log運行的時候,它是一個空的數組,但是當它顯示它有3個東西或者這些行的東西時。 – mkaatman

回答

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);

+0

我看,所以這是一個計時問題 – procatmer

+0

在setTimeout 1000毫秒是否完全像你爲我描述的那樣。 – mkaatman

2

在JavaScript控制檯中的單行顯示在你打電話console.log()時刻產生。

當您稍後單擊箭頭圖標時,在單擊箭頭時生成多行顯示

這就是爲什麼你看到兩個不同的東西:你已經改變了某個陣列的原始console.log()調用後,但你點擊箭頭前面。

如果你想看到完整的數組內容在它在console.log()通話,一個好的辦法做到這一點是使用JSON.stringify()時存在:

console.log(JSON.stringify(array, null, 4)); 

如果你不知道爲什麼,這發生了,可能的原因是你有一些異步操作,在你調用原始的console.log()之後修改了這個數組。例如,一個常見的錯誤是使Ajax調用來填充一個全局變量,然後嘗試立即使用該變量在代碼中的AJAX調用返回後 - 但這是前的數據準備和Ajax回調叫做。

在這種情況下,你不應該使用全局變量的。相反,您應該在ajax回調本身中處理從服務器返回的數據,或者處理從該回調中調用的函數中的數據。不要試圖將其存儲在全局變量中,並且不要假設其他代碼知道數據何時準備就緒。僅在回調中訪問數據。