最近在看JavaScript框架设计,在讲解类型判定的时候提到了一些“匪夷所思的情况”,不过没有明说都是什么时候会出现这些情况。自己玩儿了一下,写写随笔吧。不过可能除了我找到的,还有会其他时候会出现这些诡异的现象2333
问题:在JavaScript中,什么时候会出现
a !== a
a == b && b != a
a == !a
a == b && a == c && b != c
a != b && a != c && b == c
答案
-
参考ECMA-262 Edition 5.1 Section 11.9.6,其实!=也是true(参考11.9.3)
var a = NaN; console.log(a !== a); // true
-
只有IE6~8会出现(由于window不属于ECMAScript约束范围)
var a = window; var b = document; console.log(a == b && b != a); // true
-
参考ECMA-262 Edition 5.1 Section 11.9.3,这里也有讲解
var a = []; console.log(a == !a); // true
- 来自Douglas Crockford的JavaScript: The Good Parts,同样参考11.9.3,这里也有讲解
var a = 0; var b = ''; var c = '0'; console.log(a == b && a == c && b != c); // true
- 来源和第4道一样
var a = false; var b = undefined; var c = null; console.log(a != b && a != c && b == c); // true
JavaScript里的黑魔法真是太可怕了,啊哈哈哈哈哈……虽然都是略钻牛角尖的东西,不过实际开发中可能真的会被其中的情况坑到。所以说,在绝大多数情况下,还是能用===就用===的好……