转载:http://www.cnblogs.com/yanhaijing/p/3685290.htmlhtml
JavaScript中什么状况下使用==是正确的?简而言之:没有。这篇文章来看五种状况下老是使用===,而且解释为何不用==。浏览器
JavaScript有两种操做符用来比较两个值是否相等 [1]:服务器
给JavaScript初学者的建议是彻底忘掉 == ,而且老是使用 ===。事实证实,后者是更符合常规的。有五种案例,表面看起来能够不听从规则,但真的不是这样。从如今开始,我使用下面的规则:函数
意图清晰的代码赛过更简洁的代码。
记住:你的代码仅写一次,但被阅读不少次——尽量保证对阅读者友好。性能
例如,使用typeof操做符[2],你能确保结果是字符串。而后能够放心使用 ==,由于咱们肯定不会在发生类型转换。学习
if (typeof x == "function") { ... }
然而,有两个反对这样作的缘由:编码
当使用 == 时,undefined和null在结果上等价——他们彼此相等,互相相等,但没有意义(包括JavaScript中的能被转换为false的值):spa
> null == null true > undefined == null true > false == null false > 0 == null false
所以,下面的if语句检测的是null或undefined。code
if (x == null) { ... }
然而,这是否出于简洁性考虑,意图并不清晰:若是你同时也检测undefined,那么你能够这样写。然而,若是JavaScript初学者读到你的代码,他们可能认为你仅仅检测null。若是高手读到你的代码,他们可能认为你写错了,而且应该写成 ===。htm
if (x === undefined || x === null) { ... }
若是你有点懒的话,上面的代码能被精简为:
if (!x) { ... }
和上面同样的警告:这条件成立,若是x有否认类型的值。
undefined null false 0 ""
场景:你正工做在用户界面代码或编码处理服务器端参数。你可能会把数字编码为字符串。若是x是一个字符串,你能够像下面这样比较:
if (x == 123) { ... }
但问什么不告诉其余阅读你代码的人,若是x不是数字,它将被转换为数字?
if (Number(x) === 123) { ... }
使用 == 时你能够将一个原始值和其余原始值或包装类型 [4]实例作比较:
> function isAbc(x) { return x == "abc" } > isAbc("abc") true > isAbc(new String("abc")) true
而使用 === 时,你不能这样作:
> new String("abc") === "abc" false
左边是一个对象而右边是原始值。由于他们类型不一样因此不严格相等。然而,你一样须要向阅读你代码的人解释清楚你的意图。下面是表达式:
x == "abc"
你的目的是什么?
String(x) === "abc"
x.valueOf() === "abc"
理由是这样的:我想个人代码像JavaScript同样灵活。== 操做符帮我实现这一目的。例如JavaScript的灵活体如今它自动转换值类型:
> "abc" + false 'abcfalse' > 3 + true 4 > +"73" 73
有几个理由反驳上述假说:
> !"false" false > 7 + "3" '73' > Number("") 0
> 2 == false false > 2 == true false > Boolean(2) true
function is123Implicit(x) { return x == 123; } > is123Implicit(123) true > is123Implicit(new Number(123)) true > is123Implicit("123") true
function is123Explicit(x) { x = Number(x); return x === 123; } > is123Explicit(123) true > is123Explicit(new Number(123)) true > is123Explicit("123") true
function is123Defensive(x) { if (typeof x !== "number") { throw new TypeError("Not a number: "+x); } return x === 123; }