diff --git a/CHANGELOG.md b/CHANGELOG.md index cf826dec4..1706b437f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 5.0.5 + +* Fixed [#1667](https://github.com/mobxjs/mobx/issues/1667): creating a large array could result in undefined items (MobX 4.* was not affected) + # 4.3.2 / 5.0.4 * Fixed [#1685](https://github.com/mobxjs/mobx/issues/1685): expose `IAutorunOptions` diff --git a/src/types/observablearray.ts b/src/types/observablearray.ts index f65b685d8..68f523c6e 100644 --- a/src/types/observablearray.ts +++ b/src/types/observablearray.ts @@ -473,6 +473,7 @@ const arrayExtensions = { * faster as everything works on unproxied values */ ;[ + "concat", "every", "filter", "forEach", diff --git a/test/base/array.js b/test/base/array.js index 9fefbd8a8..fa49e8292 100644 --- a/test/base/array.js +++ b/test/base/array.js @@ -473,3 +473,22 @@ test("can define properties on arrays", () => { expect(ar.toString()).toBe("hoi") expect("" + ar).toBe("hoi") }) + +test("concats correctly #1667", () => { + const x = observable({ data: [] }) + + function generate(count) { + const d = [] + for (let i = 0; i < count; i++) d.push({}) + return d + } + + x.data = generate(10000) + const first = x.data[0] + expect(Array.isArray(x.data)).toBe(true) + + x.data = x.data.concat(generate(1000)) + expect(Array.isArray(x.data)).toBe(true) + expect(x.data[0]).toBe(first) + expect(x.data.length).toBe(11000) +})