same-value-fold-constant-number.js (1857B)
1 function SameValue(x, y) { 2 if (x === y) { 3 return (x !== 0) || (1 / x === 1 / y); 4 } 5 return (x !== x && y !== y); 6 } 7 8 var xs = [ 9 NaN, 10 +0, 11 -0, 12 1, 13 1.5, 14 -1.5, 15 Infinity, 16 -Infinity, 17 ]; 18 19 // Object.is(input, NaN) is folded to |input !== input|. 20 function testNaN() { 21 for (var i = 0; i < 500; ++i) { 22 var x = xs[i & 7]; 23 assertEq(typeof x, "number"); 24 assertEq(Object.is(NaN, x), x !== x); 25 assertEq(Object.is(x, NaN), x !== x); 26 } 27 } 28 for (let i = 0; i < 2; ++i) testNaN(); 29 30 // Object.is(input, +0) is folded to a bitwise comparison. 31 function testPositiveZero() { 32 for (var i = 0; i < 500; ++i) { 33 var x = xs[i & 7]; 34 assertEq(typeof x, "number"); 35 assertEq(Object.is(+0, x), SameValue(x, +0)); 36 assertEq(Object.is(x, +0), SameValue(x, +0)); 37 } 38 } 39 for (let i = 0; i < 2; ++i) testPositiveZero(); 40 41 // Object.is(input, -0) is folded to a bitwise comparison. 42 function testNegativeZero() { 43 for (var i = 0; i < 500; ++i) { 44 var x = xs[i & 7]; 45 assertEq(typeof x, "number"); 46 assertEq(Object.is(-0, x), SameValue(x, -0)); 47 assertEq(Object.is(x, -0), SameValue(x, -0)); 48 } 49 } 50 for (let i = 0; i < 2; ++i) testNegativeZero(); 51 52 // Object.is(input, int32) is folded to |input === int32|, when int32 isn't 0. 53 function testInt32() { 54 for (var i = 0; i < 500; ++i) { 55 var x = xs[i & 7]; 56 assertEq(typeof x, "number"); 57 assertEq(Object.is(1, x), x === 1); 58 assertEq(Object.is(x, 1), x === 1); 59 } 60 } 61 for (let i = 0; i < 2; ++i) testInt32(); 62 63 // Object.is(input, double) is folded to |input === double|, when double is 64 // neither NaN, nor +/-0. 65 function testDouble() { 66 for (var i = 0; i < 500; ++i) { 67 var x = xs[i & 7]; 68 assertEq(typeof x, "number"); 69 assertEq(Object.is(1.5, x), x === 1.5); 70 assertEq(Object.is(x, 1.5), x === 1.5); 71 } 72 } 73 for (let i = 0; i < 2; ++i) testDouble();