diff --git a/lib/compress.js b/lib/compress.js index 5a6adcd5..216826d6 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -625,7 +625,18 @@ merge(Compressor.prototype, { var e = this.expression; switch (this.operator) { case "!": return !ev(e); - case "typeof": return typeof ev(e); + case "typeof": + // Function would be evaluated to an array and so typeof would + // incorrectly return 'object'. Hence making is a special case. + if (e instanceof AST_Function) return typeof function(){}; + + e = ev(e); + + // typeof returns "object" or "function" on different platforms + // so cannot evaluate reliably + if (e instanceof RegExp) throw def; + + return typeof e; case "void": return void ev(e); case "~": return ~ev(e); case "-": diff --git a/test/compress/typeof.js b/test/compress/typeof.js new file mode 100644 index 00000000..cefdd43c --- /dev/null +++ b/test/compress/typeof.js @@ -0,0 +1,25 @@ +typeof_evaluation: { + options = { + evaluate: true + }; + input: { + a = typeof 1; + b = typeof 'test'; + c = typeof []; + d = typeof {}; + e = typeof /./; + f = typeof false; + g = typeof function(){}; + h = typeof undefined; + } + expect: { + a='number'; + b='string'; + c=typeof[]; + d=typeof{}; + e=typeof/./; + f='boolean'; + g='function'; + h='undefined'; + } +}