change `undefined == x` to `null == x` (#2882)
authorDan <dan.d.wolff@gmail.com>
Mon, 5 Feb 2018 07:00:23 +0000 (08:00 +0100)
committerAlex Lam S.L <alexlamsl@gmail.com>
Mon, 5 Feb 2018 07:00:23 +0000 (15:00 +0800)
fixes #2871

lib/compress.js
test/compress/issue-2871.js [new file with mode: 0644]

index 321ee5f..a48d0c9 100644 (file)
@@ -4790,6 +4790,7 @@ merge(Compressor.prototype, {
         if (compressor.option("comparisons")) switch (self.operator) {
           case "===":
           case "!==":
+            var is_strict_comparison = true;
             if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||
                 (self.left.is_number(compressor) && self.right.is_number(compressor)) ||
                 (self.left.is_boolean() && self.right.is_boolean()) ||
@@ -4799,8 +4800,12 @@ merge(Compressor.prototype, {
             // XXX: intentionally falling down to the next case
           case "==":
           case "!=":
+            // void 0 == x => null == x
+            if (!is_strict_comparison && is_undefined(self.left, compressor)) {
+                self.left = make_node(AST_Null, self.left);
+            }
             // "undefined" == typeof x => undefined === x
-            if (compressor.option("typeofs")
+            else if (compressor.option("typeofs")
                 && self.left instanceof AST_String
                 && self.left.value == "undefined"
                 && self.right instanceof AST_UnaryPrefix
diff --git a/test/compress/issue-2871.js b/test/compress/issue-2871.js
new file mode 100644 (file)
index 0000000..43c8352
--- /dev/null
@@ -0,0 +1,37 @@
+comparison_with_undefined: {
+    options = {
+        comparisons: true,
+    }
+    input: {
+        a == undefined;
+        a != undefined;
+        a === undefined;
+        a !== undefined;
+
+        undefined == a;
+        undefined != a;
+        undefined === a;
+        undefined !== a;
+
+        void 0 == a;
+        void 0 != a;
+        void 0 === a;
+        void 0 !== a;
+    }
+    expect: {
+        null == a;
+        null != a;
+        void 0 === a;
+        void 0 !== a;
+
+        null == a;
+        null != a;
+        void 0 === a;
+        void 0 !== a;
+
+        null == a;
+        null != a;
+        void 0 === a;
+        void 0 !== a;
+    }
+}