51 lines
1.7 KiB
JavaScript
51 lines
1.7 KiB
JavaScript
/* 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);
|