| /* Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ */ |
| |
| // Array.from copies arrays. |
| var src = [1, 2, 3], copy = Array.from(src); |
| assertEq(copy === src, false); |
| assertEq(Array.isArray(copy), true); |
| assertDeepEq(copy, src); |
| |
| // Non-element properties are not copied. |
| var a = [0, 1]; |
| a.name = "lisa"; |
| assertDeepEq(Array.from(a), [0, 1]); |
| |
| // It's a shallow copy. |
| src = [[0], [1]]; |
| copy = Array.from(src); |
| assertEq(copy[0], src[0]); |
| assertEq(copy[1], src[1]); |
| |
| // Array.from can copy non-iterable objects, if they're array-like. |
| src = {0: "zero", 1: "one", length: 2}; |
| copy = Array.from(src); |
| assertEq(Array.isArray(copy), true); |
| assertDeepEq(copy, ["zero", "one"]); |
| |
| // Properties past the .length are not copied. |
| src = {0: "zero", 1: "one", 2: "two", 9: "nine", name: "lisa", length: 2}; |
| assertDeepEq(Array.from(src), ["zero", "one"]); |
| |
| // If an object has neither an @@iterator method nor .length, |
| // then it's treated as zero-length. |
| assertDeepEq(Array.from({}), []); |
| |
| // Source object property order doesn't matter. |
| src = {length: 2, 1: "last", 0: "first"}; |
| assertDeepEq(Array.from(src), ["first", "last"]); |
| |
| // Array.from does not preserve holes. |
| assertDeepEq(Array.from(Array(3)), [undefined, undefined, undefined]); |
| assertDeepEq(Array.from([, , 2, 3]), [undefined, undefined, 2, 3]); |
| assertDeepEq(Array.from([0, , , ,]), [0, undefined, undefined, undefined]); |
| |
| // Even on non-iterable objects. |
| assertDeepEq(Array.from({length: 4}), [undefined, undefined, undefined, undefined]); |
| |
| // Array.from should coerce negative lengths to zero. |
| assertDeepEq(Array.from({length: -1}), []); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0, 0); |