description("Test default values in destructuring patterns: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-destructuring-binding-patterns"); function assert(a, b) { if (b === a) testPassed(a + "," + b); else testFailed(a + "," + b); } function test1() { var {x = 40} = {}; var {prop: y = 40} = {}; var {prop: {z} = {z: 100}} = {}; assert(x, 40); assert(y, 40); assert(z, 100); } test1(); function arr() { return [undefined, 20, undefined]; } function test2() { var [x = "Hello", y = 40, z = 30] = [undefined, 20, undefined]; assert(x, "Hello"); assert(y, 20); assert(z, 30); var [x = "Hello", y = 40, z = 30] = arr(); assert(x, "Hello"); assert(y, 20); assert(z, 30); } test2(); function test3() { var z = "z"; var [x = z] = []; assert(x, "z"); z = "zz"; var [x = eval("z")] = []; assert(x, "zz"); var [{a} = {a: 40}] = [undefined]; assert(a, 40); var [{a = 50}] = [{a: undefined}]; assert(a, 50); } test3(); function test4() { var [{prop: {b = 40}}] = [{prop: {b: undefined}}]; var [{prop: [c = 50]}] = [{prop: []}]; var [{prop: [d = 60]} = {prop: [100]}] = []; assert(b, 40); assert(c, 50); assert(d, 100) } test4(); function test5() { var {x = undefined} = {x: null}; assert(x, null); var {x = undefined} = {x: false}; assert(x, false); var {x = undefined} = {x: 0}; assert(x, 0); } test5(); function test6() { var [x = 50, y = x + 1] = []; assert(x, 50); assert(y, 51); var [x = y, y = x + 1] = []; assert(x, 51); assert(y, 52); // FIXME: make tests for TDZ failures when we land block scoping 'let' and 'const'. var [a = b, b = a] = []; assert(a, undefined); assert(b, undefined); } test6(); function test7(a, b) { var {c = a, d = c + b} = {}; assert(c, 10); assert(d, 30); } test7(10, 20); function test8(x) { // How much uglier can we make a factorial function? if (x <= 0) return {p: 1}; var {p = {p: x * test8(x - 1).p}} = {}; return p; } assert(test8(5).p, 120); assert(test8(10).p, 3628800); assert(test8(0).p, 1);