【问题标题】:Understanding how javascript evaluates the OR operator了解 javascript 如何评估 OR 运算符
【发布时间】:2019-03-08 00:27:16
【问题描述】:

我目前正在学习 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

【问题讨论】:

  • JS 中有一些 false-y 值:false0undefinednullNaN''(空字符串)。 || 如果不是 false-y,则返回第一个值;如果第一个是 false-y,则返回第二个值。所以当frequencyCounter[val]undefined 时,这个表达式产生0。如果不是,它产生那个值。

标签: javascript


【解决方案1】:

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

在 JavaScript 中,运算符 || 不会像您期望的那样返回 truefalse,它会返回第一个计算为 true 的元素(如果它被转换为布尔值),或者默认为如果没有找到最后一个元素。

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

【讨论】:

    【解决方案2】:

    这段代码非常独特,它从数组的第一个值开始并检查它是否已经存在。如果它不存在,则它是未定义的。 undefined 使用 || 与 0 进行比较操作员。如果未定义,则 val 已注册并变为 1。 在这里,我们基本上是在设置 key:value 对,如下例所示

    obj = {
      1:1,
      2:2,
      3:5
    }
    
    obj[3] = 7
    console.log(obj);
    

    如果 val 已经存在,则忽略 OR 运算符并将 1 添加到 val。这个单行代码作为 javaScript 中的计数器操作非常有用,代码的大 O 是 O(N),这比编写嵌套循环 O(N^2) 更好,这是解决此类问题的常见解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2011-07-03
      • 1970-01-01
      • 2019-12-31
      • 2020-03-27
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多