JavaScript === (triple equals)

7
给定以下代码片段:
function countZeroes(array) {
  function counter(total, element) {
    return total + (element === 0 ? 1 : 0);
  }
  return reduce(counter, 0, array);
}
  1. === 是用来做什么的?
  2. reduce 是内置函数吗?它是用来做什么的?
  3. 请解释一下这个程序的步骤。

相关:https://dev59.com/Z3RC5IYBdhLWcg3wROpQ#359509 - phwd
如果您不了解可能会得到的一些结果,使用“==”运算符可能会很危险。要查看一堆奇怪的示例,请参见此答案:https://dev59.com/Z3RC5IYBdhLWcg3wROpQ#38856418 - Luis Perez
8个回答

13

这是严格相等运算符。

它比较两个值,并根据严格相等比较算法检查它们是否相同。

这与==相反,如果被比较的值类型不同,它会尝试强制转换其中一个或两个值。那个使用抽象相等比较算法

抽象算法的规则可能会很复杂。除非有特殊需要,最好使用===

来自 MDN文档

标准的相等运算符(== 和 !=)会比较两个操作数的值,而不考虑它们的类型。严格的相等运算符(=== 和 !==)则会对相同类型的操作数进行相等比较。如果操作数必须是特定类型和值,或者操作数的确切类型很重要,那么请使用严格的相等运算符。否则,请使用标准的相等运算符,即使操作数的类型不同,也可以比较它们的身份。
关于这段代码,是这样的:
(element === 0 ? 1 : 0)

基本上,如果element的值恰好等于0,那么使用1,否则使用0
所以整个行的意思是:
return total + (element === 0 ? 1 : 0);

...如果element等于0,函数的返回值将为total + 1;否则返回值将为total + 0
你可以使用if-else语句重写这段代码:
if( element === 0 ) {
    return total + 1;
} else {
    return total + 0;
}

可能需要更新比较算法的链接。它似乎链接到垃圾站点,提供无关信息。 - ChiMo

12

=====是相同的,不同之处在于它不会强制转换变量类型。

0 == '0' -> true
0 === '0' -> false

reduce不是内置函数,但它的确会对数组中的每个元素运行计数器。

因此,对于数组的每个元素,都将检查该元素是否为0,如果是,则总数将递增。


3

===是身份运算符,类似于==,但不执行类型转换。

这个函数似乎计算数组中零的数量并返回计数。

  • 我认为reduce()的作用类似于Array.prototype.reduce

1

"==="表示"完全相等",即值和类型都相同。所以...

var x = 5;
if (x === 5) {
    alert("This will happen");
} else {
    alert ("This won't");
}

这个很少用到。

reduce函数可能是指Array.prototype.reduce()方法,它被用来按顺序(有点像)将一个函数应用于数组中的值。因此,在这种用法中,它将'counter'函数应用于数组中的所有内容,这将计算数组中零的数量并返回该值。


1

这是一个非常好的问题,通常来自其他编程语言的开发人员往往难以理解使用 === 相对于 == 的重要性。


   1. 5 == '5' //true    why? Because it do
   type conversion whereas in case with
   ===    5 === '5'//false because '5' is a string as compare to number 5.
   2. '\t\r\n' == 0 //true     this lack of transitivity is alarming and cause
   lot of errors. 
   3. Use JsLint ...it will help writing better JS code keep your code safe
   from this kind of issues.
   4. Moreover their is a performance penalty for using == when you are
   comparing number with a string.

在我的测试中,结果表明“==”和“===”之间的实际性能差异很小。虽然严格运算符在大多数浏览器中与显式类型转换(例如a === +b)结合使用时略微更快(大约10%),但唯一真正的性能提升将来自于完全避免类型转换。将字符串转换为整数以与另一个整数进行比较比简单比较两个整数要慢得多(高达10倍)。您永远不应该允许整数作为字符串存储在内部,因为类型转换会产生性能损失。
尽管这是数字的基本结论,但我在使用Firefox进行测试时发现了一个有趣的异常值。在Firefox中,当a为整数且b为字符串整数时,比较a === +b比等效的a == b慢约20倍。这个结果对我来说似乎有些可疑,在任何其他浏览器中都没有发生类似的情况。奇怪的是,当Firebug脚本调试器打开时,这个结果会改变,a === +b变得比其他方式快约10%。我不确定如何解释这个结果,但它确实提醒我们,整数应始终存储为数字,而不是字符串。

1

=== 严格相等,两边必须是相同的类型并且相等。这用于避免比较两个不相等的类型(通常是布尔值 false 和数字 0)。


0

=== 是一种严格的等式比较。在JavaScript中,== 运算符会进行类型转换,常常会产生意外的结果,例如 ' ' == false。因此大部分JavaScript开发者尽可能使用===

很难说reduce()是什么。它不是JavaScript中内置的全局函数,但它可能是指{{link2:JavaScript数组中的reduce()方法}}。 reduce() 方法对数组中的每个元素执行一次counter(),并且每次调用counter()时,它都会用counter() 调用返回的值替换total。因此,给定的函数计算数组中严格等于零的元素数。


0

关于 === 的其他答案请参考。
reduce 是 JS 中内置的函数,它类似于 "foreach",可以在数组中移动每个元素。
它从初始值开始,对第一个元素调用 counter()。
如果该元素为 0,则返回总和(即零)+1,然后返回值将成为数组中第二个元素的“总和”,以此类推...
总之:reduce 在数组的每个元素上调用 counter,进行测试并将其值添加到返回值的 (n-1)st 元素中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接