作者和开发人员似乎同意应该使用===运算符来检查值和类型。
但我问自己: 它是在语言中。所以最有原因!
因此我的问题(对于更有经验的JavaScript开发人员):
任何人都可以向我展示一个我可以从使用==运算符中获利的szenarios吗?
或者解释一下它在语言中的原因?
答案 0 :(得分:1)
我非常确定double equals的行为旨在降低学习语言的人的标准。几乎在所有情况下,除了节省一点打字之外,没有充分的理由使用双等于三倍。
Triple更快更安全。它没有做任何"魔法"。魔术糟透了。魔术不太可预测。
也就是说,双重等于是如何工作的是众所周知的,并且不会做那么多魔法。它只是转换为最近的基本类型,您可以考虑使用一个用例来比较输入字符串和数字值。
例如,quantityInput.value == 0
如果quantityInput为空或不是数字,则会出现明显的问题。但是,这个问题也会出现三等于。因此,忽略这些情况,使用三等于的同样的事情是:
Number(quantityInput.value) === 0
或+(quantityInput.value) === 0
三重相等例子的意图更清楚。我们正在接受此事(quantityInput.value
),将其转换为数字,并将其与其他数字进行比较。当然它更冗长,但在最后一个例子中,我们只增加了4个字符。
当您开始比较可能不是原语的东西时,双等于变得不太可预测。
举个例子:
var a = 'aString';
var b = {
toString: function() {
return 'aString';
}
};
a == b; // true
您可能一直期望对于双等号,比较会调用b
toString
来比较a
&#39}的字符串值,而您是对的。
但是这个怎么样?:
var a = 'aString';
var b = {
valueOf: function() {
return 'aDifferentString';
},
toString: function() {
return 'aString';
}
};
a == b; // 'aString' == 'aDifferentString' // false
valueOf
践踏toString
。 Double equals并不关心你比较的类型。如果它看到一个基元与一个对象进行比较,它首先尝试valueOf
,然后toString
秒。
当a
为0
时,b.valueOf
返回'0'
字符串时会怎样?:
var a = 0;
var b = {
toString: function() {
return '0';
}
};
a == b; // 0 == '0' // 0 === 0 // true
使用b.toString
的双等号提供String
,然后将String
投放到Number
。
现在,如果a
和b
都是在valueOf
和toString
中返回相同内容的对象,该怎么办?
var a = {
valueOf: function() {
return 'aValue';
},
toString: function() {
return 'aString';
}
};
var b = {
valueOf: function() {
return 'aValue';
},
toString: function() {
return 'aString';
}
};
a == b; // false
你在期待吗?如果没有,这应该是一个很好的例子,说明为什么魔法不好。你永远不知道魔法会有多强大。
在这种情况下,由于a
和b
都不是原语,它会跳过valueOf
和toString
调用,只是比较指针。
编辑:我将添加一个"有用的"前同事违反自己的情况"总是使用三等于"从他起草的项目代码规范中做出规则。
他使用undefined
检查potentiallyUndefinedThing == null
。他的论点是它应该得到特殊处理,因为双等于零等于未定义并且它一石二鸟(undefined
& null
检查)。实际上,几乎他使用过的每一个案例,我们都知道价值永远不会是null
或永远不会是undefined
。仅仅因为你看到推文使用==
的推文并没有使魔法犹太人成为可能。它仍然只是懒惰。
当我查看他的代码时,我并没有太多打扰我,但是当他发回我明确的=== undefined
支票并被== null
支票替换时,我畏缩了。
答案 1 :(得分:1)
===也检查数据类型,但在使用==时,仅检查值。 ie; if(2 ==' 2')返回true。但是如果我们使用(2 ===' 2')则返回false。 希望你明白。
更好地使用===总是
答案 2 :(得分:0)
例如,当您需要将对象与基本类型进行比较时:
new String("abc") === "abc"
将返回false
,因此最好在这种情况下使用==
。
new String("abc") == "abc"
将返回true
。
答案 3 :(得分:0)
相同的运算符===
和相等的==
运算符是相同的,除了在相同的运算符===
中没有进行类型转换的事实。
例如:
12.01 == "12.01" // will be true
12.01 === "12.01" // will be false