Question 31 - 40
#Q. 31. What is the event.target when clicking the button?
<div onclick="console.log('first div')">
<div onclick="console.log('second div')">
<button onclick="console.log('button')">Click!</button>
</div>
</div>
html
- A: Outer
div
- B: Inner
div
- C:
button
- D: An array of all nested elements.
💡 Answer
Answer: C
The deepest nested element that caused the event is the target of the event. You can stop bubbling by event.stopPropagation
#Q. 32. When you click the paragraph, what's the logged output?
<div onclick="console.log('div')">
<p onclick="console.log('p')">Click here!</p>
</div>
html
- A:
p
div
- B:
div
p
- C:
p
- D:
div
💡 Answer
Answer: A
If we click p
, we see two logs: p
and div
. During event propagation, there are 3 phases: capturing, target, and bubbling. By default, event handlers are executed in the bubbling phase (unless you set useCapture
to true
). It goes from the deepest nested element outwards.
#Q. 33. What's the output?
const person = { name: 'Lydia' };
function sayHi(age) {
return `${this.name} is ${age}`;
}
console.log(sayHi.call(person, 21));
console.log(sayHi.bind(person, 21));
javascript
- A:
undefined is 21
Lydia is 21
- B:
function
function
- C:
Lydia is 21
Lydia is 21
- D:
Lydia is 21
function
💡 Answer
Answer: D
With both, we can pass the object to which we want the this
keyword to refer to. However, .call
is also executed immediately!
.bind.
returns a copy of the function, but with a bound context! It is not executed immediately.
#Q. 34. What's the output?
function sayHi() {
return (() => 0)();
}
console.log(typeof sayHi());
javascript
- A: "object"
- B: "number"
- C: "function"
- D: "undefined"
💡 Answer
Answer: B
The sayHi
function returns the returned value of the immediately invoked function expression (IIFE). This function returned 0
, which is type "number"
.
FYI: there are only 7 built-in types: null
, undefined
, boolean
, number
, string
, object
, and symbol
. "function"
is not a type, since functions are objects, it's of type "object"
.
#Q. 35. Which of these values are falsy?
0;
new Number(0);
('');
(' ');
new Boolean(false);
undefined;
javascript
- A: 0, '', undefined
- B: 0, new Number(0), '', new Boolean(false), undefined
- C: 0, '', new Boolean(false), undefined
- D: All of them are falsy
💡 Answer
Answer: A
There are 8 falsy values:
undefined
null
NaN
false
''
(empty string)0
-0
0n
(BigInt(0))
Function constructors, like new Number
and new Boolean
are truthy.
#Q. 36. What's the output?
console.log(typeof typeof 1);
javascript
- A: "number"
- B: "string"
- C: "object"
- D: "undefined"
💡 Answer
Answer: B
typeof 1
returns "number"
.
typeof "number"
returns "string"
#Q. 37. What's the output?
const numbers = [1, 2, 3];
numbers[10] = 11;
console.log(numbers);
javascript
- A: [1, 2, 3, null x 7, 11]
- B: [1, 2, 3, 11]
- C: [1, 2, 3, empty x 7, 11]
- D: SyntaxError
💡 Answer
Answer: C
When you set a value to an element in an array that exceeds the length of the array, JavaScript creates something called "empty slots". These actually have the value of undefined
, but you will see something like:
[1, 2, 3, empty x 7, 11]
depending on where you run it (it's different for every browser, node, etc.)
#Q. 38. What's the output?
(() => {
let x, y;
try {
throw new Error();
} catch (x) {
(x = 1), (y = 2);
console.log(x);
}
console.log(x);
console.log(y);
})();
javascript
- A: 1 undefined 2
- B: undefined undefined undefined
- C: 1 1 2
- D: 1 undefined undefined
💡 Answer
Answer: A
The catch
block receives the argument x
. This is not the same x
as the variable when we pass arguments. This variable x
is block-scoped.
Later, we set this block-scoped variable equal to 1
, and set the value of the variable y
. Now, we log the block-scoped variable x
, which is equal to 1
.
Outside of the catch
block, x
is still undefined
, and y
is 2
. When we want to console.log(x)
outside of the catch
block, it returns undefined
, and y
returns 2
.
#Q. 39. Everything in JavaScript is either a...
- A: primitive or object
- B: function or object
- C: trick question! only objects
- D: number or object
💡 Answer
Answer: A
JavaScript only has primitive types and objects.
Primitive types are boolean
, null
, undefined
, bigint
, number
, string
, and symbol
.
What differentiates a primitive from an object is that primitives do not have any properties or methods; however, you'll note that 'foo'.toUpperCase()
evaluates to 'FOO'
and does not result in a TypeError
. This is because when you try to access a property or method on a primitive like a string, JavaScript will implicitly wrap the primitive type using one of the wrapper classes, i.e. String
, and then immediately discard the wrapper after the expression evaluates. All primitives except for null
and undefined
exhibit this behaviour.
#Q. 40. What's the output?
const arr = [
[0, 1],
[2, 3],
];
arr.reduce(
(acc, cur) => {
return acc.concat(cur);
},
[1, 2],
);
javascript
- A: [0, 1, 2, 3, 1, 2]
- B: [6, 1, 2]
- C: [1, 2, 0, 1, 2, 3]
- D: [1, 2, 6]
💡 Answer
Answer: C
[1, 2]
is our initial value. This is the value we start with, and the value of the very first acc
. During the first round, acc
is [1,2]
, and cur
is [0, 1]
. We concatenate them, which results in [1, 2, 0, 1]
.
Then, [1, 2, 0, 1]
is acc
and [2, 3]
is cur
. We concatenate them, and get [1, 2, 0, 1, 2, 3]