mapped-unmapped-args.js (1495B)
1 // An unmapped arguments object is created for strict functions or functions 2 // with default/rest/destructuring args. 3 4 load(libdir + "asserts.js"); 5 6 function testDefaults(a, b=3) { 7 a = 3; 8 b = 4; 9 assertEq(arguments.length, 1); 10 assertEq(arguments[0], 1); 11 assertEq(arguments[1], undefined); 12 arguments[0] = 5; 13 assertEq(a, 3); 14 assertThrowsInstanceOf(() => arguments.callee, TypeError); 15 } 16 testDefaults(1); 17 18 function testRest(a, ...rest) { 19 a = 3; 20 assertEq(arguments.length, 3); 21 assertEq(arguments[0], 1); 22 assertEq(arguments[1], 2); 23 arguments[0] = 5; 24 assertEq(a, 3); 25 arguments[1] = 6; 26 assertEq(arguments[1], 6); 27 assertEq(rest.toString(), "2,3"); 28 assertThrowsInstanceOf(() => arguments.callee, TypeError); 29 } 30 testRest(1, 2, 3); 31 32 function testDestructuring(a, {foo, bar}, b) { 33 a = 3; 34 bar = 4; 35 b = 1; 36 assertEq(arguments.length, 3); 37 assertEq(arguments[0], 1); 38 assertEq(arguments[1].bar, 2); 39 assertEq(arguments[2], 9); 40 assertThrowsInstanceOf(() => arguments.callee, TypeError); 41 } 42 testDestructuring(1, {foo: 1, bar: 2}, 9); 43 44 function testStrict(a) { 45 "use strict"; 46 a = 3; 47 assertEq(arguments[0], 1); 48 arguments[0] = 8; 49 assertEq(a, 3); 50 assertThrowsInstanceOf(() => arguments.callee, TypeError); 51 } 52 testStrict(1, 2); 53 54 function testMapped(a) { 55 a = 3; 56 assertEq(arguments[0], 3); 57 arguments[0] = 5; 58 assertEq(a, 5); 59 assertEq(arguments.callee, testMapped); 60 } 61 testMapped(1);