差异


1,336

可能重复:
Javascript === vs == : Does it matter which “equal” operator I use?

是什么在JavaScript =====之间的区别?我也看到了!=!==运营商。有更多这样的操作员吗?

+1

[下面是在JavaScript两个操作者的详细比较性能试验](http://conceptf1.blogspot.com/2014/01/javascript-triple-equals-vs-double-equals-operators.html 08 1月. 142014-01-08 20:08:55

  0

'=='是'==='类型转换(又名强制)。要真正理解我的意思,你可以看看这个JavaScript函数的行为完全像'==':http://stackoverflow.com/a/38856418/984780 09 8月. 162016-08-09 17:17:10

  0

除了在JS中的===和!==,他们应该还需要添加+ ==和 - ==才能在相同类型时增加或减少。 17 11月. 162016-11-17 01:32:35

1,031

===!==是严格的比较运算符:

JavaScript有既严格和 型转换相等比较。被 相比 对于严格平等对象必须具有相同的类型和:

  • 两个字符串严格相等时,他们有的 字符,相同的长度,并在相应位置相同 字符相同的序列。
  • 两个数字在数值上相等时(具有相同数字值的 )严格相等。 NaN不是 等于任何东西,包括NaN。 正和负的零等于 彼此。
  • 如果两个布尔操作数都为真或者两个布尔操作数都为假,则两个布尔操作数严格相等。
  • 如果两个对象引用同一个对象,则两个对象严格相等。
  • 空和未定义的类型是==(但不是===)。 [即(空==未定义)是事实,但(空===未定义)为假]

Comparison Operators - MDC

+3

因此,如果我举例:'if(input == null)...',当输入未定义时它是否也会使条件成立? 25 1月. 132013-01-25 23:42:22

+5

上面的说法听起来好像==比较不会检查第一个项目符号中的所有内容,“相同的字符序列,相同的长度和相应位置中的相同字符”,但事实上它确实如此。据我所知,比较两个字符串的唯一真正区别在于===时,'new String()=== new String()'返回false(不同的对象引用)。但是应该避免使用新的String。 10 2月. 132013-02-10 01:44:07

+123

-1问题是“有什么区别?“你只解释了严格的操作符,但不是它们和非严格操作符的区别 20 3月. 142014-03-20 07:21:23

+6

我没有完全得到*”如果两个对象指向同一个对象,它们是完全相等的“* - 由两个对象,这是否意味着两个引用变量..? 30 9月. 142014-09-30 08:49:28

+1

对于简单的英文描述的问题请参阅http://stackoverflow.com/a/38856418/984780 02 3月. 172017-03-02 23:08:15


1,682

到这里看看:http://longgoldenears.blogspot.com/2007/09/triple-equals-in-javascript.html

3个等号的意思是“不公平类型强制“。使用三元等值,这些值的类型也必须相同。

0 == false // true 
0 === false // false, because they are of a different type 
1 == "1"  // true, automatic type conversion for value only 
1 === "1" // false, because they are of a different type 
null == undefined // true 
null === undefined // false 
'0' == false // true 
'0' === false // false 
+74

感谢您的明确答案!我想如果相比,C#的==也会be == and ===会翻译成.Equals() 01 2月. 112011-02-01 13:02:46

+12

那么“new String()=== new String()”是什么,值和类型都是相同的,但是语句返回false。 18 9月. 122012-09-18 00:36:58

+35

@ hrishikeshp19:在这种情况下,值实际上是不同的(不同的对象引用) 23 10月. 122012-10-23 03:27:13

+16

@KoenZomers我不认为你的C#案例是正确的,实际上在C#中没有任何等价物,在C#中做一个引用比较,等于预定义比较,没有他们h在JavaScript中也是等价的。 22 11月. 122012-11-22 02:37:13

+3

@ hrishikeshp19,'new String()'不是一个字符串类型,它是一个对象类型,所以适用对象的===规则。但是,原始字符串的使用通常会导致将字符串强制转换为“String”对象,所以差别很小。如果你将'new String()'分配给两个不同的对象's1'和's2',则每个对象的'valueOf()'方法都会返回一个字符串原语,而's1.valueOf()== = s2.valueOf()'会返回'true'。 14 2月. 132013-02-14 23:26:56

  0

也'0'== false // true和 null == undefined // true 22 7月. 142014-07-22 08:23:07

+2

有人可以解释为什么'true ==“true”'是'false'吗? 09 3月. 152015-03-09 09:54:34

  0

我认为在某些情况下,您会希望在'==='上方使用'=='例如,从文本输入获取值应该是'1234'//字符串不是1234 //数字 26 6月. 152015-06-26 10:39:18

  0

有没有速度'anArray.indexOf(el)'''== -1和'=== -1'之间的区别? 30 7月. 162016-07-30 13:36:54

+1

@AlexandruSeverin自'true =='true'=== false'但是'true =='1'=== true',我会说'true'被转换为'1',然后转换为' '1',然后'1'=='true'=== false &&'1'=='1'=== true' 30 7月. 162016-07-30 13:45:49

  0

@伊丽莎白只是想让你看到我之前对'true = ='true'=== false'。不是一个解释,但它可能会给你一些提示。 30 7月. 162016-07-30 13:47:36

  0

@sdfx您可能在示例框上方有错字。你写的: “ - 3个等号表示没有类型强制的平等。 我觉得你的意思写“的2个等号的意思是‘没有强制类型转换平等’,而不是‘3 ...’ 是否准确? 08 12月. 162016-12-08 07:04:07

  0

更多意想不到的例子退房http://stackoverflow.com/ a @ 388646418/984780 02 3月. 172017-03-02 23:09:08

  0

@EarthEngine部分不正确:在c#中,=='仅使用引用类型进行引用比较,对于值类型,比较涉及内存中的值,否则用'int a = 3; var b =( a == 3);''b'将始终为假;} 29 6月. 172017-06-29 08:48:04

  0

@Shockwaver事实上,当没有自定义的'=='运算符时,c#中的==只会为引用类型(类类型)进行引用比较('operator =='),你可以看到'string'尤其如此:它被定义为一个值比较,而不是参考比较,因为重载操作符的存在 29 6月. 172017-06-29 11:11:45

  0

@EarthE ngine当然,但是所有系统定义的值类型都会在它们的'operator =='重载中进行值比较。更一般的情况是,你现在说''=='行为是在方法体内决定的。但是当你之前说过(前5年前的XD sry)== ==只是参考比较它是不正确的;) 29 6月. 172017-06-29 15:01:36

  0

例如,你可以使一个引用类型为'operator =='重载,它将与内存对象匹配值! 29 6月. 172017-06-29 15:08:59

  0

事实上,我已经在我的最后一条评论中同意你的看法,并给出了另一个反例:'string'是引用对象,但它的'=='通过值进行比较,而不是通过引用。 29 6月. 172017-06-29 23:57:19

  0

@ riship89永远不要声明基元(数字,字符串,布尔等)作为对象,因为它会产生令人讨厌的副作用,例如。 var x =“John”; var y = new String(“John”); x === y会给虚假的。 07 3月. 182018-03-07 09:44:33