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中文网其他相关文章!