destructuring-assignment.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. describe("parsing", () => {
  2. test("single name", () => {
  3. expect(`var { a } = {};`).toEval();
  4. expect(`const { a } = {};`).toEval();
  5. expect(`let { a } = {};`).toEval();
  6. });
  7. test("single name with rest values", () => {
  8. expect(`var { a, ...rest } = {};`).toEval();
  9. expect(`const { a, ...rest } = {};`).toEval();
  10. expect(`let { a, ...rest } = {};`).toEval();
  11. });
  12. test("single aliased name", () => {
  13. expect(`var { a: b } = {};`).toEval();
  14. expect(`const { a: b } = {};`).toEval();
  15. expect(`let { a: b } = {};`).toEval();
  16. });
  17. test("single aliased name with rest values", () => {
  18. expect(`var { a: b, ...rest } = {};`).toEval();
  19. expect(`const { a: b, ...rest } = {};`).toEval();
  20. expect(`let { a: b, ...rest } = {};`).toEval();
  21. });
  22. test("array destructuring patterns", () => {
  23. expect(`var [ a ] = [];`).toEval();
  24. expect(`const [ a ] = [];`).toEval();
  25. expect(`let [ a ] = [];`).toEval();
  26. });
  27. test("destructuring assignment with rest assignments, array patterns", () => {
  28. expect(`var [ a, ...rest ] = [];`).toEval();
  29. expect(`const [ a, ...rest ] = [];`).toEval();
  30. expect(`let [ a, ...rest ] = [];`).toEval();
  31. });
  32. test("destructuring assignment with rest names, array patterns with recursive patterns", () => {
  33. expect(`var [ a, [ ...rest ] ] = [];`).toEval();
  34. expect(`const [ a, [ ...rest ] ] = [];`).toEval();
  35. expect(`let [ a, [ ...rest ] ] = [];`).toEval();
  36. });
  37. test("destructuring assignment with rest names, array patterns with recursive patterns 2", () => {
  38. expect(`var [ a, [ ...{length} ] ] = [];`).toEval();
  39. expect(`const [ a, [ ...{length} ] ] = [];`).toEval();
  40. expect(`let [ a, [ ...{length} ] ] = [];`).toEval();
  41. });
  42. test("function parameters cannot use member expressions", () => {
  43. expect("function f([a.b]) {}").not.toEval();
  44. expect("function f([b[0]]) {}").not.toEval();
  45. expect("function f({c:a.b}) {}").not.toEval();
  46. expect("function f({a:b[0]}) {}").not.toEval();
  47. expect("([a.b]) => 1").not.toEval();
  48. expect("([b[0]]) => 2").not.toEval();
  49. expect("({c:a.b}) => 3").not.toEval();
  50. expect("({a:b[0]}) => 4").not.toEval();
  51. });
  52. });
  53. describe("evaluating", () => {
  54. test("single name", () => {
  55. let o = { a: 1 };
  56. {
  57. var { a } = o;
  58. expect(a).toBe(o.a);
  59. }
  60. {
  61. const { a } = o;
  62. expect(a).toBe(o.a);
  63. }
  64. {
  65. let { a } = o;
  66. expect(a).toBe(o.a);
  67. }
  68. });
  69. test("single name with rest values", () => {
  70. let o = { a: 1, b: 2 };
  71. {
  72. var { a, ...b } = o;
  73. expect(a).toBe(o.a);
  74. expect(b).toEqual({ b: 2 });
  75. }
  76. {
  77. const { a, ...b } = o;
  78. expect(a).toBe(o.a);
  79. expect(b).toEqual({ b: 2 });
  80. }
  81. {
  82. let { a, ...b } = o;
  83. expect(a).toBe(o.a);
  84. expect(b).toEqual({ b: 2 });
  85. }
  86. });
  87. test("single aliased name", () => {
  88. let o = { a: 1 };
  89. {
  90. var { a: x } = o;
  91. expect(x).toBe(o.a);
  92. }
  93. {
  94. const { a: x } = o;
  95. expect(x).toBe(o.a);
  96. }
  97. {
  98. let { a: x } = o;
  99. expect(x).toBe(o.a);
  100. }
  101. });
  102. test("single aliased name with rest values", () => {
  103. let o = { a: 1, b: 2 };
  104. {
  105. var { a: x, ...b } = o;
  106. expect(x).toBe(o.a);
  107. expect(b).toEqual({ b: 2 });
  108. }
  109. {
  110. const { a: x, ...b } = o;
  111. expect(x).toBe(o.a);
  112. expect(b).toEqual({ b: 2 });
  113. }
  114. {
  115. let { a: x, ...b } = o;
  116. expect(x).toBe(o.a);
  117. expect(b).toEqual({ b: 2 });
  118. }
  119. });
  120. test("array patterns", () => {
  121. let o = [1, 2, 3, 4];
  122. {
  123. var [a, b] = o;
  124. expect(a).toBe(o[0]);
  125. expect(b).toBe(o[1]);
  126. }
  127. {
  128. const [a, b] = o;
  129. expect(a).toBe(o[0]);
  130. expect(b).toBe(o[1]);
  131. }
  132. {
  133. let [a, b] = o;
  134. expect(a).toBe(o[0]);
  135. expect(b).toBe(o[1]);
  136. }
  137. });
  138. test("destructuring assignment with rest names, array patterns", () => {
  139. let o = [1, 2, 3, 4];
  140. {
  141. var [a, ...b] = o;
  142. expect(a).toBe(o[0]);
  143. expect(b).toEqual(o.slice(1));
  144. }
  145. {
  146. const [a, ...b] = o;
  147. expect(a).toBe(o[0]);
  148. expect(b).toEqual(o.slice(1));
  149. }
  150. {
  151. let [a, ...b] = o;
  152. expect(a).toBe(o[0]);
  153. expect(b).toEqual(o.slice(1));
  154. }
  155. });
  156. test("destructuring assignment with rest names, array patterns with recursive patterns", () => {
  157. let o = [1, [2, 3, 4]];
  158. {
  159. var [a, [b, ...c]] = o;
  160. expect(a).toBe(o[0]);
  161. expect(b).toBe(o[1][0]);
  162. expect(c).toEqual(o[1].slice(1));
  163. }
  164. {
  165. const [a, [b, ...c]] = o;
  166. expect(a).toBe(o[0]);
  167. expect(b).toBe(o[1][0]);
  168. expect(c).toEqual(o[1].slice(1));
  169. }
  170. {
  171. let [a, [b, ...c]] = o;
  172. expect(a).toBe(o[0]);
  173. expect(b).toBe(o[1][0]);
  174. expect(c).toEqual(o[1].slice(1));
  175. }
  176. });
  177. test("destructuring assignment with rest names, array patterns with recursive patterns 2", () => {
  178. let o = [1, [2, 3, 4]];
  179. {
  180. var [a, [...{ length }]] = o;
  181. expect(a).toBe(o[0]);
  182. expect(length).toBe(o[1].length);
  183. }
  184. {
  185. const [a, [...{ length }]] = o;
  186. expect(a).toBe(o[0]);
  187. expect(length).toBe(o[1].length);
  188. }
  189. {
  190. let [a, [...{ length }]] = o;
  191. expect(a).toBe(o[0]);
  192. expect(length).toBe(o[1].length);
  193. }
  194. {
  195. expect(() => {
  196. let [a, b, [...{ length }]] = o;
  197. }).toThrowWithMessage(TypeError, "ToObject on null or undefined");
  198. }
  199. });
  200. test("patterns with default", () => {
  201. let o = { a: 1 };
  202. let { x = "foo", a = "bar" } = o;
  203. expect(x).toBe("foo");
  204. expect(a).toBe(o.a);
  205. });
  206. test("can use big int values as number-like properties", () => {
  207. let o = { "99999999999999999": 1 };
  208. let { 123n: a = "foo", 99999999999999999n: b = "bar" } = o;
  209. expect(a).toBe("foo");
  210. expect(b).toBe(1);
  211. });
  212. });