/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ "use strict"; const x = Object.freeze([1, 2, 3]); let fakeArray = { [Symbol.isConcatSpreadable]: true, length: 2, 0: "hello", 1: "world" } assertDeepEq(x.concat(fakeArray), [1, 2, 3, "hello", "world"]); assertDeepEq(x.concat(fakeArray, fakeArray), [1, 2, 3, "hello", "world", "hello", "world"]); for (let truthy of [true, 3.41, "abc", Symbol(), {}]) { let obj = {[Symbol.isConcatSpreadable]: truthy, length: 1, 0: "hey"} assertDeepEq(x.concat(obj), [1, 2, 3, "hey"]); } for (let notTruthy of [null, undefined, false, 0, NaN, ""]) { let obj = {[Symbol.isConcatSpreadable]: notTruthy, length: 1, 0: "hey"} assertDeepEq(x.concat(obj), [1, 2, 3, obj]); } let array = [5, 4]; assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]); // Can make arrays non-spreadable array[Symbol.isConcatSpreadable] = false; assertDeepEq(x.concat(array), [1, 2, 3, [5, 4]]); // Explicitly spreadable array[Symbol.isConcatSpreadable] = true; assertDeepEq(x.concat(array), [1, 2, 3, 5, 4]); reportCompare(true, true);