assert 'string' === typename '';
assert 'integer' === typename 3 * 8;
assert 'double' === typename 3.1;
assert 'function' === typename print;
assert 'string' === typename typename 3;
assert 'undefined' === typename undefined;
assert 'undefined' === typename $omeUndefined$ymbol;
assert 'object' === typename s2.('prototype');
assert 'object' === typename s2.'prototype';
assert 'object' === typename s2.prototype;
assert 'object' === typename s2['pro'+'totype'];
assert 'object' === typename s2[('p'+('r'+('o')))+('totype')];

assert 'integer' === typename 8*2.3;
assert 18 === 8*2.3 /* LHS type determines result type,
                       but double on the RHS is honored
                       for multiplication/division purposes
                       and the result gets truncated to an int.
                    */;
assert 'double' === typename 8.0*2.3;
