
Implement the syntax and behavor necessary to support array literals such as [...[1, 2, 3]]. A type error is thrown if the target of the spread operator does not evaluate to an array (though it should eventually just check for an iterable). Note that the spread token's name is TripleDot, since the '...' token is used for two features: spread and rest. Calling it anything involving 'spread' or 'rest' would be a bit confusing.
43 lines
807 B
JavaScript
43 lines
807 B
JavaScript
load("test-common.js");
|
|
|
|
function testArray(arr) {
|
|
return arr.length === 4 &&
|
|
arr[0] === 0 &&
|
|
arr[1] === 1 &&
|
|
arr[2] === 2 &&
|
|
arr[3] === 3;
|
|
}
|
|
|
|
try {
|
|
let arr = [0, ...[1, 2], 3];
|
|
assert(testArray(arr));
|
|
|
|
let a = [1, 2];
|
|
arr = [0, ...a, 3];
|
|
assert(testArray(arr));
|
|
|
|
let obj = { a: [1, 2] };
|
|
arr = [0, ...obj.a, 3];
|
|
assert(testArray(arr));
|
|
|
|
arr = [...[], ...[...[0, 1, 2]], 3];
|
|
assert(testArray(arr));
|
|
|
|
assertThrowsError(() => {
|
|
[...1];
|
|
}, {
|
|
error: TypeError,
|
|
message: "1 is not iterable",
|
|
});
|
|
|
|
assertThrowsError(() => {
|
|
[...{}];
|
|
}, {
|
|
error: TypeError,
|
|
message: "[object Object] is not iterable",
|
|
});
|
|
|
|
console.log("PASS");
|
|
} catch (e) {
|
|
console.log("FAIL: " + e);
|
|
}
|