原谅我的困惑......我正在浏览整个W3School的JS作为快速参考,以面向所有JS ......
遇到这个代码,虽然我理解它的机制,但我不明白它是如何工作的,即找到最大的数字。
通过与负无穷大比较,找到最大数字的工作原理会有什么帮助?
代码:(link of where it came from)
<!DOCTYPE html>
<html>
<body>
<p>Finding the largest number.</p>
<p id="demo"></p>
<script>
function findMax() {
var i;
var max = -Infinity;
for(i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
document.getElementById("demo").innerHTML = findMax(4, 5, 6);
</script>
</body>
</html>
答案 0 :(得分:1)
通过与负无穷大比较,找到最大数字的工作原理会有什么帮助?
此处的代码并不总是与否定Infinity
进行比较:
var max = -Infinity;
但是它只是将max
变量初始化为-Infinity
,因此它保证当我们循环数组值时,不会有任何低于它的值。< / p>
<强>分析:强>
例如,当我们调用findMax(4, 5, 6)
时,我们将进行三次迭代:
if(arguments[0] > max)
&lt; ==&gt; 4>-Infinity
为true
max=4
。if(arguments[1] > max)
&lt; ==&gt; 5>4
为true
max=5
。if(arguments[2] > max)
&lt; ==&gt; 6>5
为true
max=6
。<强>结论:强>
因此,您可以在此处看到max
值将始终使用array
中的第一个元素进行更新,因为任何传递的数字都将高于-Infinity
,即使我们传递了负值例如-1240000
,-9999999
或-102457933210 they will always be higher than
- Infinity`。
答案 1 :(得分:1)
-Infinity
是<
运算符的中性元素。
这意味着:
-∞ > T = false for every T
如果您从-∞
开始循环,则始终将第一个元素设为maximum
。
如果您想使用链(其数学等价于循环)找到maximum
:
s1 = max of e1,e2
s2 = max of s1,e3
s3 = max of s2,e4
...
您可以重写为:
s1 = max of e1,-∞
s2 = max of s1,e2
s3 = max of s2,e3
...
此处s1 = e1
。
答案 2 :(得分:0)
function findMax() {
console.log(arguments)
var i;
var max = -Infinity;
for(i = 0; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
console.log(i, max);
}
return max;
}
console.log(findMax(1, 2, 3, 4));
如您所见,(1, 2, 3, 4)
在数组[arguments]
中传递。在每次迭代时,arguments[i] > max
然后max = arguments[i]
注意 - 无穷大是最小的数字,因此最初的max将初始化为-Infinity
答案 3 :(得分:0)
该示例使用-Infinity
作为开始比较的绝对最小数字。所以,例如,如果你传递了所有负数,并且它们都是相对较大的负数,那么你的最大函数就可以工作。
e.g。 findMax(-123456, -123459, -1234832383483)
在这个例子中,它是一个很好的初始值,而不是零。在这种情况下,零将是findMax的结果,因为前一个示例中的所有数字都小于零。
答案 4 :(得分:0)
当您尝试确定如何执行此操作时,答案可能会变得清晰。这是另一个候选解决方案:
function findMax() {
var i;
var max = arguments[0];
for (i = 1; i < arguments.length; i++) {
if (arguments[i] > max) {
max = arguments[i];
}
}
return max;
}
这个似乎更简单。你不需要一个初始值,取而代之的是参数的第一个值。
似乎有效:
findMax(8, 6, 7, 5, 3, 0, 9, 8, 6, 7, 5); //=> 9
即使您只提供一个值,它仍然有效:
findMax(42); //=> 42
你能看到失败的地方吗?这种实现存在严重问题。
你找到了吗?
findMax(); //=> undefined
当你传递它时根本没有参数,你得到undefined
,这是一个非数字结果。
使用其他版本,它将返回-Infinity
。这个答案有一个数字类型;所以函数总是返回一个数字。具有一致的返回类型使得使用系统进行编程变得更加容易。
如果你真的想更深入地理解基本思想,想象一下concatenateAllStrings
函数。你可以用同样的方式做到这一点,为你遇到的每个新字符串添加你的最终价值。但你需要从一些事情开始。只有一个合理的选择:空字符串。这是因为任何字符串s
,'' + s //=> s
。在您的情况下,您希望值x
对于任何数字n
,n >= x
都是如此。什么比每个数字少?真的只有 - 无限。
为了更深入一点,你可以调查&#34;折叠半群&#34;。
我在采访JS开发人员时实际上使用过相关的事实。这只是一旦用户表明自己具有合理的能力。我问这样的事情:
这听起来有点像一个技巧问题,但目标是了解如何尝试理解现有系统。
Math.max() < Math.min()
这是一个奇怪的Javascript怪癖。您能否讨论如何实施max
和min
来实现这一目标?
然后我引导她完成它,提供尽可能多的提示,直到她完整地解释它。没有人知道答案。候选人需要多少指导,以及她似乎能理解这些解释,这有助于我确定对她有用的东西。