function ArithGeo(arr) {
var diff = arr[1]-arr[0];
var ratio = arr[1]/arr[0];
var allRatioAreGood = true;
var allDiffAreGood = true;
for(var i = 2;i<arr.length;i++){
// console.log(arr[i]-arr[i-1] == diff);
allRatioAreGood &= (arr[i]/arr[i-1] == ratio);
allDiffAreGood &= (arr[i]-arr[i-1] == diff);
}
// code goes here
if (allRatioAreGood){
return "Geometric"
}else if (allDiffAreGood){
return "Arithmetic";
}else {
return -1
}
}
console.log(ArithGeo([2, 4, 6, 7 , 8 ,10]));
&#39;&amp; =&#39;我们在for循环中使用它的意思是什么?它是如何工作的?有人可以解释一下吗?
另外,这两条线是如何工作的?
allRatioAreGood &= (arr[i]/arr[i-1] == ratio);
allDiffAreGood &= (arr[i]-arr[i-1] == diff);
有人可以解释一下吗?
答案 0 :(得分:5)
这是按位AND赋值。
在您的代码示例中,我们来看看第一个:
allRatioAreGood &= (arr[i]/arr[i-1] == ratio);
将值arr[i]
和arr[i-1]
相互划分(生成比率),并测试该比率的相等性(使用==
),生成true
或false
值。
然后将该值按位与allRatioAreGood
的现有值进行按位同步,这意味着如果allRatioAreGood
的先前值为false(二进制0
),那么所有将来的值for allRatioAreGood
也会导致false(因为AND操作,0&amp; 1 = 0)。
结果是allRatioAreGood
和allDiffAreGood
计算出该数组中的所有值是否通过该测试的相等性,即,如果所有值都具有“良好比率”或“好的差异”。
然而,在这个特定的例子中,比较器正在检查比率和除法结果之间的相等性,这意味着因为除法运算的结果是浮点数,所以当其他数字不等于它时使用==
进行测试。为了测试“足够接近等于”,需要使用epsilon。有关详细信息,请参阅此其他SO答案:What's wrong with using == to compare floats in Java?(不要担心这是Java与JavaScript,概念是相同的)。此外,这会变得更加复杂,因为在Javascript中,如果ratio
或分割操作的结果为NaN
或Infinity
,则在比较两者时,您将始终获得false
号。
来自文档:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Assignment_Operators
按位AND赋值运算符使用两个操作数的二进制表示,对它们执行按位AND运算并将结果赋给变量。有关详细信息,请参阅按位AND运算符。
语法
接线员:
x &= y
含义:x = x & y
实施例
var bar = 5;
// 5: 00000000000000000000000000000101
// 2: 00000000000000000000000000000010
bar &= 2; // 0
答案 1 :(得分:1)
a &= b;
与说法相同:
a = a & b;
那么为什么要用这个表格呢?也许你有一个更复杂的表达,并希望明确a
和a
是相同的左值:
obj.array[index].bits = obj.array[index].bits & mask;
与
obj.array[index].bits &= mask;
答案 2 :(得分:0)
答案 3 :(得分:0)
按位AND
分配,几乎如果你有5 & 3
,则使用按位将数字转换为基数2,即00101
&amp; 00011
(前面多了0个)并得到1
,因为这个数字都是1
(真)
通常,&&
是一个乘法,||
是加法,按位相同,1 & 1
是1 * 1
,1 | 1
是{{1}这是真实的(即使它仍然被认为是1 + 1
..)