javascript - 了解 javascript 如何评估 OR 运算符

标签 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

最佳答案

这个想法是,如果 frequencyCounter1[val]undefined,它默认为 0undefined + 1 返回 NaN 并且它不会像程序员预期的那样工作,所以他使用 || 来解决这个问题而不必编写额外的代码行。

在 JavaScript 中,运算符 || 不会像您期望的那样返回 truefalse,它返回第一个元素如果它被转换为 bool 值,则计算为 true,如果未找到,则默认为最后一个元素。

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

关于javascript - 了解 javascript 如何评估 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054992/

相关文章:

javascript - 单击菜单项时如何切换菜单容器

javascript - 使用内部定义变量的 JSON 定义

javascript - 在同一来源/域上使用 javascript 发布数据(安全风险?

javascript - 对象 HTMLImageElement 显示而不是图像

javascript - 如何在单击事件后更改 session 值,以便页面刷新不会重置 Meteor 上的 session

javascript - 这种情况下如何让函数有返回值

javascript - 保持 Twitter Typeahead 建议下拉菜单打开

javascript - 在 shell 执行期间无法使用 socket.io 发出当前服务器状态

javascript - UIWebView - 独立于文本缩放图像

javascript - 渲染具有大量节点的 Vuetify v-treeview 的最佳方法是什么?