exp-operator-precedence-unary-expression-semantics.js (2532B)
1 // Copyright (C) 2016 Rick Waldron. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 author: Rick Waldron 6 esid: sec-unary-operators 7 description: Exponentiation Operator expression precedence of unary operators 8 info: | 9 ExponentiationExpression : 10 UnaryExpression 11 ... 12 13 UnaryExpression : 14 ... 15 `delete` UnaryExpression 16 `void` UnaryExpression 17 `typeof` UnaryExpression 18 `+` UnaryExpression 19 `-` UnaryExpression 20 `~` UnaryExpression 21 `!` UnaryExpression 22 features: [exponentiation] 23 ---*/ 24 25 assert.sameValue(-(3 ** 2), -9, "-(3 ** 2) === -9"); 26 assert.sameValue(+(3 ** 2), 9, "+(3 ** 2) === 9"); 27 assert.sameValue(~(3 ** 2), -10, "~(3 ** 2) === -10"); 28 assert.sameValue(!(3 ** 2), false, "!(3 ** 2) === false"); 29 30 31 assert.sameValue(2 ** -2, 0.25); 32 33 var o = { p: 1 }; 34 35 assert.sameValue(2 ** delete o.p, 2, "delete o.p -> true -> ToNumber(true) -> 1"); 36 assert.sameValue(2 ** void 1, NaN, "void 1 -> undefined -> ToNumber(undefined) -> NaN"); 37 assert.sameValue(2 ** typeof 1, NaN, "typeof 1 -> 'number' -> ToNumber('number') -> NaN"); 38 39 var s = "2"; 40 var n = 2; 41 42 assert.sameValue(2 ** +s, 4, "+s -> +'2' -> 2 -> ToNumber(2) -> 2"); 43 assert.sameValue(2 ** +n, 4, "+s -> +2 -> 2 -> ToNumber(2) -> 2"); 44 45 assert.sameValue(2 ** -s, 0.25, "-s -> -'2' -> -2 -> ToNumber(-2) -> -2"); 46 assert.sameValue(2 ** -n, 0.25, "-s -> -2 -> -2 -> ToNumber(-2) -> -2"); 47 48 assert.sameValue(2 ** ~s, 0.125, "~s -> ~'2' -> -3 -> ToNumber(-3) -> -3"); 49 assert.sameValue(2 ** ~n, 0.125, "~s -> ~2 -> -3 -> ToNumber(-3) -> -3"); 50 51 assert.sameValue(2 ** !s, 1, "!s -> !'2' -> false -> ToNumber(false) -> 0"); 52 assert.sameValue(2 ** !n, 1, "!s -> !2 -> false -> ToNumber(false) -> 0"); 53 54 55 var capture = []; 56 var leftValue = { valueOf() { capture.push("leftValue"); return 3; }}; 57 var rightValue = { valueOf() { capture.push("rightValue"); return 2; }}; 58 59 (capture.push("left"), leftValue) ** +(capture.push("right"), rightValue); 60 // ^ 61 // Changes the order 62 63 // Expected per operator evaluation order: "left", "right", "rightValue", "leftValue" 64 assert.sameValue(capture[0], "left", "Expected the 1st element captured to be 'left'"); 65 assert.sameValue(capture[1], "right", "Expected the 2nd element captured to be 'right'"); 66 assert.sameValue(capture[2], "rightValue", "Expected the 3rd element captured to be 'rightValue'"); 67 assert.sameValue(capture[3], "leftValue", "Expected the 4th element captured to be 'leftValue'"); 68 69 reportCompare(0, 0);