javascript - 為什麼 console.log() 會產生 /**id:4**/ 和 /**ref:4**/ 的值?
幾分鐘前我做了這個回答,答案片段如下
let obj = {staff_changes: []};
let newStaff=[];
for (let i = 0; i < 4; i++) {
newStaff.push({id: 'staff' +i});
obj.staff_changes.push({
id: i,
newStaff: newStaff
});
}
console.log(obj);如果你執行上述片段,你可以看到 /**id:4**/ 和 /**ref:4**/。這是什麼?
當程式碼在執行時,它正在將相同的重複值推入陣列中。所以我希望在開始時它生成一個 Id:4,如果存在相同的重複值,那麼它就只寫一個註解像 /**ref:4**/,其中 4 表示已經生成的 Id:4。
所以我想知道 我的理解是否正確? 如果我的理解是正確的,那我們該如何避免這個情況? 我是否應該在將數值推入陣列之前使用
object.assign()來避免這個問題?
答案#1
你的資料結構包含多個指向同一個物件的引用。console.log 足夠智能,可以簡化輸出。
請注意,(據我所知,AFAIK)對於不是 String 實例的物件,規範並不保證 console.log 會輸出任何特定內容,因此你不能依賴這個輸出在不同瀏覽器、版本、月相等等條件下是一致的。
考慮一個無限遞歸的資料結構,例如 const a=[]; a.push(a); console.log(a),你會偏好哪一種情況:電腦在打印無限遞歸陣列時鎖死,還是 console.log 將其簡寫?
const a = []
a.push(a)
console.log(a)
// [
// /**id:1**/
// /**ref:1**/
// ]答案#2
根據你的控制台工具,它們會以不同的方式顯示這樣的物件。那些註解是在告訴你物件中有更深層的資訊。
如果你想以一致的方式查看內部結構,你可以將整個對象轉成字串
console.log(JSON.stringify(obj));
在這種情況下,你得到:
{"staff_changes":[{"id":0,"newStaff":[{"id":"staff0"},{"id":"staff1"},{"id":"staff2"},{"id":"staff3"}]},{"id":1,"newStaff":[{"id":"staff0"},{"id":"staff1"},{"id":"staff2"},{"id":"staff3"}]},{"id":2,"newStaff":[{"id":"staff0"},{"id":"staff1"},{"id":"staff2"},{"id":"staff3"}]},{"id":3,"newStaff":[{"id":"staff0"},{"id":"staff1"},{"id":"staff2"},{"id":"staff3"}]}]}
在某些開發者工具中,當你將物件記錄到控制台時,你可以展開它,但上述字串輸出會在所有工具中一致地顯示整個內容。
