Salve a tutti, su un corso che sto seguendo su Udemy a proposito degli algoritmi e strutture dati di Javascript, sto analizzando il Frequency counter pattern e di seguito vi riporto il codice.

function same(arr1, arr2){
if(arr1.length !== arr2.length){
returnfalse;
}
let frequencyCounter1 = {}
let frequencyCounter2 = {}
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] ||
0) + 1
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] ||
0) + 1
}
for(let key in frequencyCounter1){
if(!(key ** 2in frequencyCounter2)){
returnfalse }
if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
returnfalse
}
}
returntrue}

Nella riga N°8 non riesco a capire come si comporta il loop.
Quello che sono riuscito a decifrare è che ad
codice:
frequencyCounter1[val]
gli si possono assegnare 2 valori a seconda della condizione ma il simbolo ||(or) mi manda in confusione.
Qualcuno saprebbe spiegarmi in maniera dettagliata passo passo il comportamento di questo algoritmo?
Vi ringrazio in anticipo per l'aiuto.