"Bitwise or" is the name of the | operator. JavaScript coerces arr1 and arr2[i] to binary (a set of 0s and/or 1s), then ors them.
For a given set of bits, the bitwise operator evaluates them like this:
(0 | 0) === 0
(0 | 1) === 1
(1 | 0) === 1
(1 | 1) === 1
arr1.map(arr1, i)... creates a locally scoped variable arr1 with the same name as the array it's mapping. So, inside the map function, arr1 refers to the item at array index i. It should be renamed for clarity.
arr2[i] just evaluates to the value from the 2nd array, which is in the same position during the map's loop. So, in this case, for a given index of the loop:
i |
arr1 |
arr2[i] |
| 0 |
46 |
27 |
| 1 |
33 |
56 |
| 2 |
33 |
19 |
| 3 |
22 |
14 |
| 4 |
31 |
14 |
| 5 |
50 |
10 |
Then the confusing part of your code ((arr1 | arr2[i])) does a bitwise or on the binary values:
| arr1 |
Number(arr1).toString(2) |
arr2[i] |
Number(arr2[i]).toString(2) |
Bitwise Or (binary) |
| 46 |
101110 |
27 |
011011 |
111111 |
| 33 |
100001 |
56 |
111000 |
111001 |
| 33 |
100001 |
19 |
010011 |
110011 |
| 22 |
010110 |
14 |
001110 |
011110 |
| 31 |
011111 |
14 |
001110 |
011111 |
| 50 |
110010 |
10 |
001010 |
111010 |
Then your code .toString(2).padStart(n, 0).replace(/0/g, " ").replace(/1/g, "#") just uses the binary values above and replaces zeroes with spaces, and ones with octothorpes: ['######', '### #', '## ##', ' #### ', ' #####', '### # ']