| /* Any copyright is dedicated to the Public Domain. |
| * http://creativecommons.org/licenses/publicdomain/ */ |
| |
| // Array.from can be applied to any constructor. |
| // For example, the Date builtin constructor. |
| var d = Array.from.call(Date, ["A", "B"]); |
| assertEq(Array.isArray(d), false); |
| assertEq(Object.prototype.toString.call(d), "[object Date]"); |
| assertEq(Object.getPrototypeOf(d), Date.prototype); |
| assertEq(d.length, 2); |
| assertEq(d[0], "A"); |
| assertEq(d[1], "B"); |
| |
| // Or Object. |
| var obj = Array.from.call(Object, []); |
| assertEq(Array.isArray(obj), false); |
| assertEq(Object.getPrototypeOf(obj), Object.prototype); |
| assertEq(Object.getOwnPropertyNames(obj).join(","), "length"); |
| assertEq(obj.length, 0); |
| |
| // Or any JS function. |
| function C(arg) { |
| this.args = arguments; |
| } |
| var c = Array.from.call(C, {length: 1, 0: "zero"}); |
| assertEq(c instanceof C, true); |
| assertEq(c.args.length, 1); |
| assertEq(c.args[0], 1); |
| assertEq(c.length, 1); |
| assertEq(c[0], "zero"); |
| |
| // If the 'this' value passed to Array.from is not a constructor, |
| // a plain Array is created. |
| var arr = [3, 4, 5]; |
| var nonconstructors = [ |
| {}, Math, Object.getPrototypeOf, undefined, 17, |
| () => ({}) // arrow functions are not constructors |
| ]; |
| for (var v of nonconstructors) { |
| obj = Array.from.call(v, arr); |
| assertEq(Array.isArray(obj), true); |
| assertDeepEq(obj, arr); |
| } |
| |
| // Array.from does not get confused if global.Array is replaced with another |
| // constructor. |
| function NotArray() { |
| } |
| var RealArray = Array; |
| NotArray.from = Array.from; |
| Array = NotArray; |
| assertEq(RealArray.from([1]) instanceof RealArray, true); |
| assertEq(NotArray.from([1]) instanceof NotArray, true); |
| |
| if (typeof reportCompare === 'function') |
| reportCompare(0, 0); |