2015-12-19 44 views
0

我有一個JavaScript對象中的數組,其行爲方式我無法解釋。我在哪裏可以找到有關JavaScript中對象內數組行爲的信息?

的代碼是:

var board = { 
    val: [false], 
    init: function() { 

     console.log(board);  // when expanded, console says board.val[0] = true 
     console.log(board.val); // console says board.val[0] = false 

     board.val[0] = true; 
    }, 
}; 

board.init(); 

的方法輸出在控制檯中對象,然後修改該數組中的值。但是在值被改變之前對象的輸出表明該值已經被改變。

我在尋找一個解釋爲什麼這種情況正在發生,或者是一個解釋的鏈接。如有需要,請在評論中澄清。我會很樂意提供任何我忽略的細節。

在我工作的項目的數組是一個大型的,多維數組,而這種行爲是造成意外的結果。對不起,我沒有任何想法或研究分享。我不知道要搜索什麼,這不會讓我瞭解JavaScript數組的基礎知識。我以爲我知道JavaScript數組和對象是如何工作的,但這是困擾我的。

+1

剛剛測試過你的代碼,它(正確)輸出'false'。您是在特定的瀏覽器還是在NodeJS中測試? – Martin

+0

數組本身不能爲真或假。你的例子沒有意義。 –

+1

board.val是一個數組。你應該測試board.val [0]。你爲什麼不簡單地分配board.val = false而不是board.val = [false]? – Ludo

回答

3

這就是控制檯的工作原理 - 當您記錄一個完整的(未擴展的)對象時,在您將其擴展爲時(而不是在對象記錄時),您會看到其屬性值。所以,就你而言,你變得真實,因爲它在此期間成爲現實。

有沒有「修復」對於這一點,除了登錄時,它也許字符串化的對象,但每當你需要一個變量的準確表示,一定要登錄變量本身,而不是它的父對象。

它儘快的行爲與數組和對象以同樣的方式,爲您的數組/對象嵌套足夠深,以便控制檯將其摺疊,看:

var arr = [[false]]; 
 
var obj = {sub: {subsub: false}}; 
 
console.log(arr, obj, JSON.stringify(arr), JSON.stringify(obj)); 
 

 
arr[0][0] = true; 
 
obj.sub.subsub = true;

開放控制檯,將它們都展開,並且您會在同一控制檯行中看到矛盾(錯誤/真實)。

+0

謝謝!這幫了很多。 – jay

+0

沒問題,我很高興能幫上忙。 – Shomz

相關問題