了解javascript如何评估OR运算符

时间:2019-03-08 00:27:17

标签: javascript

我目前正在研究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

1 个答案:

答案 0 :(得分:5)

这个想法是,如果frequencyCounter1[val]undefined,则默认为0undefined + 1返回NaN,它无法按程序员的预期工作,因此他使用||来解决该问题,而不必编写其他代码。

在JavaScript中,运算符||不返回您期望的truefalse,它返回第一个元素,如果它是true转换为布尔值,如果找不到则默认为最后一个元素。

例如,(null || "" || undefined || false || NaN || "test" || 2)将返回"test"