Code Golf in JavaScript refers to attempting a problem to solve using the least amount of characters possible. Like in Golf, the low score wins, the fewest amount of characters “wins”. JavaScript is a fantastic language for code golfing due to backward compatibility, quirks, it is being a high-level language, and all the coercion. So, here we will look at some Code Golfing techniques in JavaScript language:
1. Checks if a variable is equal to some positive no: We can simply do this with a bunch of if-else statements, but we have different methods also like subtracting that positive integer from the number and checks whether it is greater than zero or not.
- Original Code:
if(a == 5){ yes(); }else{ no(); }
- Golfed Code – I
x == 3 ? "y" : "n";
- Golfed Code – II
x-3 ? "y" : "n";
- Golfed Code – III
x^3 ? "y" : "n";
2. Checking the case of literals: We can even compare the literal with {} for checking its case, it returns true for the uppercase and false for the lowercase.
- Golfed Code:
'g' < {} // Returns false, lower case 'G' < {} // Returns true, upper case
3. Floor the value: A straight forward solution is used in floor function present in the Math library but it takes little more characters. We can do the same in a few characters by using the | operator.
- Original Code:
a = Math.floor(a);
- Golfed Code:
a = 0 | a;
4. Ceil value: A straight forward solution is to use ceil function present in the Math library but it takes little more characters. We can do the same in a few characters by using the combination of %, ~ operator.
- Original Code:
a = Math.ceil(a);
- Golfed Code:
a = a%1 ? -~a : a;
5. Rounding the value: A straight forward solution is used to round function present in the Math library but it takes little more characters. We can do the same in a few characters by using the combination of |, + operator.
- Original Code:
a = Math.round(a);
- Golfed Code:
a = 0 | a + .5;
6. Arrow functions: Arrow functions provides a concise way to write functions in the JavaScript.
- Original Code:
g = function (a) { return a * a * a; }
- Golfed Code:
g = a => a*a*a;
7. Alternatives for min function: Ternary operator always saves bytes. We can compare two numbers using the ternary operator.
- Original Code:
Math.min(x, y);
- Golfed Code:
a < b ? a : b
8. Alternatives for max function: Ternary operator always saves bytes. We can compare two numbers using the ternary operator.
- Original Code:
Math.max(x, y);
- Golfed Code:
a < b ? b : a
9. Absolute value: A straight forward solution is to use absolute function present in the Math library but it takes little more characters. We can do the same in a few characters by using the ternary operator.
- Original Code:
Math.abs(x)
- Golfed Code:
x < 0 ? -x : x
10. Save bytes in Loops: We can save bytes by changing the variable on the last time used.
- Original Code:
for(x = 0; x < 10; x++){ alert(x); }
- Golfed Code:
for(x = 0; x < 3 ; ){ alert(x++); }
11. Calculating Sum or Product of Array: We have the option to do task by iterating the loop but for saving bytes we can use eval and arithmetic operators like +, *, ^etc.
- Golfed Code:
eval(a.join('+')) eval(a.join`+`) eval(a.join('*')) eval(a.join`*`)
12. Check for NaN: NaN method in JavaScript is used to determines whether the passed value is NaN(Not a Number) and is of the type “Number”.
- Original Code:
if(isNaN(x)){ alert(x); }
- Golfed Code:
if(x != x){ alert(x); }
Note: It only works if typeof(x) == “number”
13. for vs while loops: Both loops are efficient in terms of time complexity but when it comes to space complexity, many times for loop outbeats while loop.
- Golfed Code:
i = 10; while(i--); # While loop for(i = 10; i--; ); # For loop
14. Combining Nested loops into a single loop: We can combine the nested loop of 2 or more degree into a single loop.
- Original Code:
for(i = 10; i--; ) for(j = 5; j--; ) do_something(i, j)
- Golfed Code:
for(i = 50; i--; ) do_something(0 | i/5, i%5)
15. Generating Random numbers between the range: We can use the Date class to generate the random number because the Date is stored internally in JavaScript as the number of milliseconds since an epoch.
- Golfed Code:
new Date%1500 // Random integer 0 <= x < 1500