我目前正在学习 Javascript 算法。以下是我目前正在尝试学习/理解的算法。
function same(arr1, arr2){
if(arr1.length !== arr2.length){
return false;
}
let frequencyCounter1 = {}
let frequencyCounter2 = {}
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
console.log(frequencyCounter1);
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) +1
}
for(let key in frequencyCounter1){
if(!(key ** 2 in frequencyCounter2)){
return false
}
if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
return false
}
}
return true
}
same([1,2,3,2,5], [9,1,4,4,11])
我理解代码,除了 1 行。
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
那么这个算法的作用是尝试比较 2 个数组。如果数组 b 等于数组 a 中每个数的平方,则返回 true,否则返回 false。
所以在这个例子中,它会返回false
如果我做 [1,2,3,4,5] [1,4,9,16,25],它会返回 true
我知道这一行是做什么的:
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
它生成了一个键值对,所以说对于第一次迭代,它以 1 作为键,然后将 (frequencyCounter1[val] || 0) +1 作为值,现在这个值代表了 a 的数量数字出现在数组中的次数,所以如果 1 出现 10 次,它将有一个键值对 1:10
我很清楚这一点,只是想知道这个声明是如何评估的,幕后发生了什么?
(frequencyCounter1[val] || 0) +1
最佳答案
这个想法是,如果 frequencyCounter1[val]
是 undefined
,它默认为 0
。 undefined + 1
返回 NaN
并且它不会像程序员预期的那样工作,所以他使用 ||
来解决这个问题而不必编写额外的代码行。
在 JavaScript 中,运算符 ||
不会像您期望的那样返回 true
或 false
,它返回第一个元素如果它被转换为 bool 值,则计算为 true
,如果未找到,则默认为最后一个元素。
例如,(null || ""|| undefined || false || NaN || "test"|| 2)
将返回 "test"
关于javascript - 了解 javascript 如何评估 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054992/