10 JavaScript Interview Questions
Every question is followed by Output and a rough Explanation.
Mehul Lakhanpal
Note: Every question is followed by Output and a rough Explanation. Scroll at your own risk.
Q1.
var msg = "hello";
if (true) {
var msg = "welcome";
}
console.log(msg);
// ----
let msg2 = "hello";
if (true) {
let msg2 = "welcome";
}
console.log(msg2);
Output
welcome
hello
Explanation
var
is function scoped, therefore, when msg
is declared inside the if
block, it overrides the msg
in the global scope. This does not happen with let
as it is block scoped.
Q2.
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
Output
5
5
5
5
5
Explanation
Since var
is function scoped the i
variable holds the value 5
after the loop ends. The callback function in the setTimeout
gets the same value for every occurrence.
Solution
- Convert
var
tolet
to create a scope for every iteration.
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
- Wrap the
setTimeout
in an anonymous function. Passingi
as a parameter scopes it to the anonymous function and therefore the value is not lost.
for (var i = 0; i < 5; i++) {
(function (x) {
setTimeout(function () {
console.log(x);
}, 1000);
})(i);
}
Q3.
const obj = {
["foo_" + (() => 1)()]: "Hello",
};
console.log(obj);
Output
{ foo_1: 'Hello' }
Q4.
console.log([1,2,3] + [4,5,6]);
Output
1,2,34,5,6
Explanation
String([1,2,3]);
is "1,2,3"
Hence, "1,2,3" + "4,5,6"
is "1,2,34,5,6"
Q5. What's the order of execution?
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');
Output
1
4
3
2
Explanation
Priority for event loop is: call stack > microtask > macrotask
All the synchronous code is executed first
Therefore, logs 1
, 4
Next, there is a Promise
and a setTimeout
Promise callback is stored in microtask queue
& setTimeout callback is stored in macrotask queue
microtask
has a higher priority over macrotask
. Therefore, it logs 3
followed by 2
Q6.
console.log(typeof typeof 1);
Output
string
Explanation
Evaluate from Right to Left
typeof 1
return numbertypeof 'number'
returns string
Q7.
console.log(Math.max() < Math.min());
Solution
true
Explanation
The default value for Math.max()
is -Infinity
& default value for Math.min()
is Infinity
Hence, -Infinity < Infinity
is true
Q8.
function func() {
return foo;
foo = 1;
function foo() {}
var foo = "hello";
}
console.log(typeof func());
Output
function
Explanation
Due to one round of parsing (hoisting) the code looks like this
function func() {
var foo; // hoisted
function foo() {} // hoisted
return foo;
foo = 1;
foo = "hello";
}
console.log(typeof func());
Because of that, the last value available for foo is function
Q9.
console.log(3 > 2 > 1);
Output
false
Explanation
It starts from left to right
so 3 > 2
equals true
true > 1
is equivalent to 1 > 1
which is false
Q10.
function fn() {
return this.str;
}
var str = "global";
var obj = {
str: "obj",
};
console.log(fn(), fn.call(obj));
Output
global obj
Explanation
When executing fn()
the value of this
is window
and window.str
is global
.
.call()
assigns this
to obj
and obj.str
is obj
Note: This solution works in non-strict
mode.
Thanks for reading 💙
Upvote
Mehul Lakhanpal

Related Articles