Being great developer has nothing to do with passing interview, because most interviews are about weird questions, like what are your weaknesses and question about the legacy feature of a language which nobody hasn't used in 10 years. Nevertheless, we have to play the game by the rules.
#0 Tricky Function Call
What is the output in the console?
Answer
The answer is 30.25
. The trick is, if you put parentheses with arguments immediately after function declaration, that will be considered a function call.
#1 Fat Arrow + Declaration Overlap
What is the output in the console?
Answer
The answer is '1'
. The trick is that due to duplicate declaration of b as variable and parameter, it gets resolved as parameter. Since we call our function only with 1
parameter – 1 + []
equals '1'
. Pay attention that type of returned value is string.
#2 Variable and Function Names Overlap
What is the output in the console?
Answer
Output will be [10], 10, [10], 10
. The key is to understand that in case of variable and parameter names war – parameter wins. There are a few other tricks here. arguments
is an object and in this case it is [10]
. ...f
is a way to group the rest of the function parameters into named array, in this case all the parameters are resulting into [10]
.
#3 Variable Scope
What is the output in the console?
Answer
There are two tricks here. First – executing code using function scope – (function(){}())
pattern. Second – exploiting global/local scope overlap. Both foo
and bar
defined in global scope. Function redefines foo
in local scope, so global foo
is not changed, when bar
gets reassigned to 1
. Finally, 1 + 10 = 11
.
#4 Global + Local
What is the output in the console?
Answer
This will print out undefined
and 10
rather than 5
and 10
since JavaScript always moves variable declarations (not initializations) to the top of the scope, making the code equivalent to:
#5 Chained Assignment
What is the output in the console?
Answer
This will print out undefined
and number
rather than number
and number
since var a = b = 3
is equivalent to b = 3; var a = b;
. Making b
global variable. What is usage of chained notation is not recommended by many styles to avoid accidental global variable declarations.
#6 Auto Semicolon
What is the output in the console?
Answer
This will print out object
and undefined
. Javascript has automatic semicolon insertion and one of them is inserting semicolon after return statement, making second function equal to return;
, thus returning undefined
.
#7 Javascript Number
What is the output in the console?
Answer
Most likely it will output 0.30000000000000004
, false
, and true
. Number in JS are represented as double-precision 64-bit binary format IEEE 754 values. Thus there are rounding errors, as well as there is Number.MAX_SAFE_INTEGER
, after which Number.MAX_SAFE_INTEGER === Number.MAX_SAFE_INTEGER + 1
equals to true
. Number.EPSILON should be used to avoid rounding error while comparing numbers in javascript for equality.
#8 Object Keys
What is the output in the console?
Answer
This will print out 333
, not 111
. When setting an object property, JavaScript will implicitly stringify the parameter value. In this case, since b
and c
are both objects, they will both be converted to "[object Object]"
. As a result, a[b]
anda[c]
are both equivalent to a["[object Object]"]
and can be used interchangeably. Thus, setting or referencing a[c]
is precisely the same as setting or referencing a[b]
.
#9 setTimeout Loops
What is the output in the console?
Answer
This will print out 5, 5, 5, 5, 5
and 0, 1, 2, 3, 4
.
setTimeout
function will be called after whole cycle is executed because of JavaScript event queue. Variables declared using var
are global by default – meaning i
would be equal to 5
after the end of a cycle. Since all setTimeout functions are called after the cycle, the all would print 5
.
Output of second loop even more bizarre. In ECMA 6 specification, the specified behaviour is that in for(let i;;){}
i
gets a new binding for every iteration of the loop. Essentially each closure inside a loop gets a different instance of i
#10 Chained Relationals
What is the output in the console?
Answer
This will print out true
and false
. There are two tricks here. In Javascript relational operators evaluated from left to right, false equals 0
, and true equals 1
for number comparisons. First expression after first step is true < 2
=> 1 < 2
=> true
, and second is true > 1
=> 1 > 1
=> false
.
TL; DR;
Javascript has many interview traps, so unless you prepare for them or have memorized ECMA specifications you are likely to fail at an interview at some point.
Comments