2012-01-05 49 views
1

我提出了从this Code Academy lesson看到的问题。预先感谢您的解释。为什么===在Javascript中有一些奇怪的行为?

希望这不会经常重复。

--------从教训说明如下----------------加入

您可能已经注意到,我们已经使用了两个迄今为止的等号类型,单个等于(=)和双倍或三倍等于(==,===)。单等于(=)分配一个变量,而double和triple等于(==,===)用于检查值之间的等价。由于==在JavaScript中可能有一些奇怪的行为,因此使用===几乎总是更好。

运行此练习以查看它的功能。它首先将可变字设置为字符串“this”。更改代码,以便word ===“that”的计算结果为true,并运行console.log()命令。

+2

你愿意在这里发表问题吗? – 2012-01-05 06:43:11

+0

奇怪的是什么? – 2012-01-05 06:44:23

+0

@SergioTulentsev:我认为这个问题在标题中很明显。 – stanigator 2012-01-05 06:44:57

回答

6

三元等于===如果两个操作数是相同类型且具有相同值,则返回true。

double等于==如果两个操作数可以强制为相同类型(遵循特定的一组规则)并且在被强制后具有相同的值,则返回true。

因此,一些例子:

1 === 1  // true 
1 === "1"  // false 
1 == 1  // true 
1 == "1"  // true 
"5" == 2 + 3 // true 
0 == ""  // true 
0 === ""  // false 
null == undefined  // true 
null === undefined  // false 
3

如果两个变量包含相同的值但不是相同的类型,==“强制”相等并返回true。然而,===将返回false,因为它要求两个变量具有相同的值是相同的tye以便相等。否则,他们的行为类似。

+0

==可以“强制”包含相同值的不同类型的两个变量之间的等式?这是否意味着我可以使用===在JavaScript中强健地比较不同类型的变量? – stanigator 2012-01-05 06:47:33

+0

是的,所以如果你想要严格,我会推荐===,如果不是,==。 – 2012-01-05 06:56:17

+0

很酷,谢谢! – stanigator 2012-01-05 06:57:34

3

==检查值是否相等。 ===检查值是否相同。

为了说明这个例子,看看这个:

"1" == 1 // this is TRUE, because the values are equivalent. 
"1" === 1 // this is FALSE, because the values are of different types. 

我还没有遇到这样的情况,我需要在JavaScript ===的情况下,因为它是一个相对较新的除了语言,因此,例如indexOf返回负数表示“不匹配”(而PHP返回false所以你必须使用===“不匹配”和“比赛在字符串的开始”之间的区别)。

+0

最近加了多久? – stanigator 2012-01-05 06:51:45

+0

“相对较近”?我承认我无法给出推出时间的约会,但至少已经有十年左右的时间了。 – nnnnnn 2012-01-05 06:52:16

+0

我不知道它何时添加,但它绝对不是在JavaScript 1.3中。但是,任何人都可以举例说明什么时候需要'==='? – 2012-01-05 06:53:14

4

唯一的情况下,我知道具有“古怪的行为” ===是当原生价值(例如

"a" === "a"       // true 
"a" == new String("a")    // true 
"a" === new String("a")    // false- uh, what? 
new String("a") == new String("a") // false- thought it was gonna be true? :) 
new String("a") === new String("a") // false 
var a = new String("a"); a === a // true 

这同样适用于其他的包装类型,如Numberstring)是针对对象值(例如String),该“可转换为”原生的值进行比较。这是因为,当使用===时,JavaScript使用不执行强制的不同算法。

已经有过去在那里某些方法,在String.prototype说一些有趣的浏览器的bug,会返回一个String而不是string导致代码以微妙的方式打破。

正如其他人指出的,==的行为通常更有趣。我几乎完全发现==是否正确的事情,但了解细节对掌握JavaScript很重要。

快乐编码。