Array.prototype.fill() 中的物件參考
使用Array.prototype.fill() 用物件初始化陣列時,值得注意的是,該方法傳遞對相同物件的引用,而不是為每個元素建立新實例。在初始化後修改物件的屬性時,這可能會導致意外行為。
請考慮以下範例:
var arr = new Array(2).fill({}); arr[0] === arr[1]; // true arr[0].test = 'string'; arr[1].test === 'string'; // also true
在此範例中,使用相同的物件參考初始化兩個陣列元素。結果,arr[0]和arr[1]都引用同一個物件。當在 arr[0] 上設定 test 屬性時,由於共用引用,它也會自動在 arr[1] 上設定。
為了避免此問題,可以用任意值填充數組,然後然後使用map()為每個元素建立新物件:
var arr = new Array(2).fill(undefined).map(u => ({})); var arr = new Array(2).fill().map(Object);
在這些範例中,未定義或空值最初用於填充數組。隨後,使用 map() 為每個元素建立新對象,從而有效地用不同的對象填入數組。
以上是為什麼 Array.prototype.fill() 建立物件參考而不是副本?的詳細內容。更多資訊請關注PHP中文網其他相關文章!