Question 121 - 130
#121. What's the output?
const config = {
languages: [],
set language(lang) {
return this.languages.push(lang);
},
};
console.log(config.language);
javascript
- A:
function language(lang) { this.languages.push(lang }
- B:
0
- C:
[]
- D:
undefined
Đáp án
Answer: D
The language
method is a setter
. Setters don't hold an actual value, their purpose is to modify properties. When calling a setter
method, undefined
gets returned.
#122. What's the output?
const name = 'Lydia Hallie';
console.log(!typeof name === 'object');
console.log(!typeof name === 'string');
javascript
- A:
false
true
- B:
true
false
- C:
false
false
- D:
true
true
Đáp án
Answer: C
typeof name
returns "string"
. The string "string"
is a truthy value, so !typeof name
returns the boolean value false
. false === "object"
and false === "string"
both returnfalse
.
(If we wanted to check whether the type was (un)equal to a certain type, we should've written !==
instead of !typeof
)
#123. What's the output?
const add = (x) => (y) => (z) => {
console.log(x, y, z);
return x + y + z;
};
add(4)(5)(6);
javascript
- A:
4
5
6
- B:
6
5
4
- C:
4
function
function
- D:
undefined
undefined
6
Đáp án
Answer: A
The add
function returns an arrow function, which returns an arrow function, which returns an arrow function (still with me?). The first function receives an argument x
with the value of 4
. We invoke the second function, which receives an argument y
with the value 5
. Then we invoke the third function, which receives an argument z
with the value 6
. When we're trying to access the value x
, y
and z
within the last arrow function, the JS engine goes up the scope chain in order to find the values for x
and y
accordingly. This returns 4
5
6
.
#124. What's the output?
async function* range(start, end) {
for (let i = start; i <= end; i++) {
yield Promise.resolve(i);
}
}
(async () => {
const gen = range(1, 3);
for await (const item of gen) {
console.log(item);
}
})();
javascript
- A:
Promise {1}
Promise {2}
Promise {3}
- B:
Promise {<pending>}
Promise {<pending>}
Promise {<pending>}
- C:
1
2
3
- D:
undefined
undefined
undefined
Đáp án
Answer: C
The generator function range
returns an async object with promises for each item in the range we pass: Promise{1}
, Promise{2}
, Promise{3}
. We set the variable gen
equal to the async object, after which we loop over it using a for await ... of
loop. We set the variable item
equal to the returned Promise values: first Promise{1}
, then Promise{2}
, then Promise{3}
. Since we're awaiting the value of item
, the resolved promise, the resolved values of the promises get returned: 1
, 2
, then 3
.
#125. What's the output?
const myFunc = ({ x, y, z }) => {
console.log(x, y, z);
};
myFunc(1, 2, 3);
javascript
- A:
1
2
3
- B:
{1: 1}
{2: 2}
{3: 3}
- C:
{ 1: undefined }
undefined
undefined
- D:
undefined
undefined
undefined
Đáp án
Answer: D
myFunc
expects an object with properties x
, y
and z
as its argument. Since we're only passing three separate numeric values (1, 2, 3) instead of one object with properties x
, y
and z
({x: 1, y: 2, z: 3})
, x
, y
and z
have their default value of undefined
.
#126. What's the output?
function getFine(speed, amount) {
const formattedSpeed = new Intl.NumberFormat('en-US', {
style: 'unit',
unit: 'mile-per-hour',
}).format(speed);
const formattedAmount = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
}).format(amount);
return `The driver drove ${formattedSpeed} and has to pay ${formattedAmount}`;
}
console.log(getFine(130, 300));
javascript
- A: The driver drove 130 and has to pay 300
- B: The driver drove 130 mph and has to pay $300.00
- C: The driver drove undefined and has to pay undefined
- D: The driver drove 130.00 and has to pay 300.00
Đáp án
Answer: B
With the Intl.NumberFormat
method, we can format numeric values to any locale. We format the numeric value 130
to the en-US
locale as a unit
in mile-per-hour
, which results in 130 mph
. The numeric value 300
to the en-US
locale as a currency
in USD
results in $300.00
.
#127. What's the output?
const spookyItems = ['👻', '🎃', '🕸'];
({ item: spookyItems[3] } = { item: '💀' });
console.log(spookyItems);
javascript
- A:
["👻", "🎃", "🕸"]
- B:
["👻", "🎃", "🕸", "💀"]
- C:
["👻", "🎃", "🕸", { item: "💀" }]
- D:
["👻", "🎃", "🕸", "[object Object]"]
Đáp án
Answer: B
By destructuring objects, we can unpack values from the right-hand object, and assign the unpacked value to the value of the same property name on the left-hand object. In this case, we're assigning the value "💀" to spookyItems[3]
. This means that we're modifying the spookyItems
array, we're adding the "💀" to it. When logging spookyItems
, ["👻", "🎃", "🕸", "💀"]
gets logged.
#128. What's the output?
const name = 'Lydia Hallie';
const age = 21;
console.log(Number.isNaN(name));
console.log(Number.isNaN(age));
console.log(isNaN(name));
console.log(isNaN(age));
javascript
- A:
true
false
true
false
- B:
true
false
false
false
- C:
false
false
true
false
- D:
false
true
false
true
Đáp án
Answer: C
With the Number.isNaN
method, you can check if the value you pass is a numeric value and equal to NaN
. name
is not a numeric value, so Number.isNaN(name)
returns false
. age
is a numeric value, but is not equal to NaN
, so Number.isNaN(age)
returns false
.
With the isNaN
method, you can check if the value you pass is not a number. name
is not a number, so isNaN(name)
returns true. age
is a number, so isNaN(age)
returns false
.
#129. What's the output?
const randomValue = 21;
function getInfo() {
console.log(typeof randomValue);
const randomValue = 'Lydia Hallie';
}
getInfo();
javascript
- A:
"number"
- B:
"string"
- C:
undefined
- D:
ReferenceError
Đáp án
Answer: D
Variables declared with the const
keyword are not referenceable before their initialization: this is called the temporal dead zone. In the getInfo
function, the variable randomValue
is scoped in the functional scope of getInfo
. On the line where we want to log the value of typeof randomValue
, the variable randomValue
isn't initialized yet: a ReferenceError
gets thrown! The engine didn't go down the scope chain since we declared the variable randomValue
in the getInfo
function.
#130. What's the output?
const myPromise = Promise.resolve('Woah some cool data');
(async () => {
try {
console.log(await myPromise);
} catch {
throw new Error(`Oops didn't work`);
} finally {
console.log('Oh finally!');
}
})();
javascript
- A:
Woah some cool data
- B:
Oh finally!
- C:
Woah some cool data
Oh finally!
- D:
Oops didn't work
Oh finally!
Đáp án
Answer: C
In the try
block, we're logging the awaited value of the myPromise
variable: "Woah some cool data"
. Since no errors were thrown in the try
block, the code in the catch
block doesn't run. The code in the finally
block always runs, "Oh finally!"
gets logged.