为什么===在Javascript中有一些奇怪的行为?

时间:2012-01-05 06:42:20

标签: javascript

我提出的问题是从this Code Academy lesson看到的。提前感谢您的解释。

希望这不会经常重复。

--------本课程的说明将在下面添加----------------

  

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

     

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

5 个答案:

答案 0 :(得分:6)

如果两个操作数的类型相同且值相同,则三等于===将返回true。

如果两个操作数都可以强制转换为相同的类型(遵循一组特定的规则)并且在被强制后具有相同的值,则双等于==将返回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

答案 1 :(得分:4)

我知道===具有“奇怪行为”的唯一情况是将 native-value (例如string)与对象值进行比较(例如String)“可转换为”原生值:

"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

其他包装类型也是如此,例如Number。这是因为,在使用===时,JavaScript使用不执行强制的不同算法。

过去有一些有趣的浏览器错误,某些方法(例如String.prototype)会返回String而不是string会导致代码以微妙的方式中断。< / p>

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

快乐的编码。

答案 2 :(得分:3)

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

答案 3 :(得分: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,因此您必须使用===来区分“不匹配”和“字符串开头匹配”。

答案 4 :(得分:2)

我会高度建议您通过Bucky Schwarz观看此演示文稿:

在最初的5分钟内,他谈到了这个话题。

取自他的一张幻灯片:

'' == '0' // false
 0 == ''  // true
 0 == '0' // true

false == 'false' // false
false == '0'     // true
false == 0       // true

false == undefined // false
false == null      // false
null  == undefined // true