【问题标题】:Difference between == and === in JavaScript [duplicate]JavaScript中==和===之间的区别[重复]
【发布时间】:2010-10-06 03:16:27
【问题描述】:

JavaScript 中的===== 有什么区别?我也见过!=!== 运算符。这样的运营商还有吗?

【问题讨论】:

  • ===== 类型转换(又名强制)。要真正理解我的意思,您可以查看这个行为与 == 完全相同的 JavaScript 函数:stackoverflow.com/a/38856418/984780
  • 啊,是的,抽象相等运算符 (==),也称为 if-same-type-then-strict-equality-comparison-otherwise-treat-null-and-undefined- and-document-dot-all-as-equal-but-if-string-involved-with-number-or-bigint-then-coerce-string-to-respective-numeric-type-but-if-boolean-involved-然后强制它到数字但是如果涉及对象然后强制它到原始和如果涉及数字类型然后比较他们的数字值与- distinct-infinities-and-nans-being-unequal-and-then-repeat-as-needed 运算符。

标签: javascript comparison-operators equality-operator identity-operator


【解决方案1】:

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

三个等号表示“没有类型强制的平等”。使用三等号,值的类型也必须相等。

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

【讨论】:

  • 感谢您的明确答复!我想如果与 C# 相比, == 也将是 == 并且 === 将转换为 .Equals()
  • “new String()===new String()”怎么样,值和类型都是一样的。但是语句返回 false。
  • @hrishikeshp19:在这种情况下,值实际上是不同的(不同的对象引用)
  • @KoenZomers 我认为您的 C# 案例不正确。实际上在 C# 中没有等价物。 == 在 C# 中进行引用比较,而 Equals 进行预定义比较,它们在 JavaScript 中也没有等价物。
  • @hrishikeshp19, new String() 不是字符串类型,而是对象类型,因此适用对象的 === 规则。然而,原始字符串的使用通常会导致将字符串强制转换为String 对象,因此差异很细微。如果要将new String() 分配给两个不同的对象s1s2,则每个对象上的valueOf() 方法将为每个对象返回一个字符串原语,s1.valueOf() === s2.valueOf() 将返回true
【解决方案2】:

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

JavaScript 具有严格和 类型转换相等比较。 对于strict 相等,对象是 比较必须具有相同的类型并且:

  • 当两个字符串具有相同的序列时,它们是严格相等的 字符,相同的长度和相同的 对应位置的字符。
  • 两个数在数值相等时严格相等(有 相同的数值)。 NaN 不是 等于任何东西,包括NaN。 正零和负零相等 彼此。
  • 如果两个布尔操作数都为真或 两者都是错误的。
  • 如果两个对象引用相同的Object,则它们是严格相等的。
  • NullUndefined 类型是 ==(但不是 ===)。 [IE。 (Null==Undefined) 是 true 但 (Null===Undefined) 是 false]

Comparison Operators - MDC

【讨论】:

  • 那么,如果我这样做例如:if (input == null) ...,当输入未定义时它是否也会使条件为真?
  • 上述内容听起来好像 == 比较不会检查第一个要点中的所有内容,“相同的字符序列,相同的长度和相同的字符在相应的位置”但是事实上确实如此。据我所知,比较两个字符串时唯一真正的区别是使用 ===,new String()===new String() 返回 false(不同的对象引用)。但是无论如何都应该避免new String
  • -1 问题是“有什么区别?”而且您只解释了严格的运算符,但没有解释它们与非严格运算符的区别
  • 我没有完全理解“如果两个对象引用同一个对象,则它们是严格相等的” - 什么?通过两个对象,是否意味着两个引用变量..?
  • 有关问题的简单英文描述,请参阅stackoverflow.com/a/38856418/984780
猜你喜欢
  • 2015-09-03
  • 2017-04-11
  • 2017-06-25
  • 2013-01-28
  • 2017-03-24
  • 2016-09-04
  • 2018-09-20
  • 2011-11-05
相关资源
最近更新 更多