Question 71 - 80
#71. How can we log the values that are commented out after the console.log statement?
function* startGame() {
const answer = yield 'Do you love JavaScript?';
if (answer !== 'Yes') {
return "Oh wow... Guess we're gone here";
}
return 'JavaScript loves you back ❤️';
}
const game = startGame();
console.log(/* 1 */); // Do you love JavaScript?
console.log(/* 2 */); // JavaScript loves you back ❤️
javascript
- A:
game.next("Yes").value
andgame.next().value
- B:
game.next.value("Yes")
andgame.next.value()
- C:
game.next().value
andgame.next("Yes").value
- D:
game.next.value()
andgame.next.value("Yes")
Answer
Answer: C
A generator function "pauses" its execution when it sees the yield
keyword. First, we have to let the function yield the string "Do you love JavaScript?", which can be done by calling game.next().value
.
Every line is executed, until it finds the first yield
keyword. There is a yield
keyword on the first line within the function: the execution stops with the first yield! This means that the variable answer
is not defined yet!
When we call game.next("Yes").value
, the previous yield
is replaced with the value of the parameters passed to the next()
function, "Yes"
in this case. The value of the variable answer
is now equal to "Yes"
. The condition of the if-statement returns false
, and JavaScript loves you back ❤️
gets logged.
#72. What's the output?
console.log(String.raw`Hello\nworld`);
javascript
- A:
Hello world!
- B:
Hello
world
- C:
Hello\nworld
- D:
Hello\n
world
Answer
Answer: C
String.raw
returns a string where the escapes (\n
, \v
, \t
etc.) are ignored! Backslashes can be an issue since you could end up with something like:
const path = `C:\Documents\Projects\table.html`
Which would result in:
"C:DocumentsProjects able.html"
With String.raw
, it would simply ignore the escape and print:
C:\Documents\Projects\table.html
In this case, the string is Hello\nworld
, which gets logged.
#73. What's the output?
async function getData() {
return await Promise.resolve('I made it!');
}
const data = getData();
console.log(data);
javascript
- A:
"I made it!"
- B:
Promise {<resolved>: "I made it!"}
- C:
Promise {<pending>}
- D:
undefined
Answer
Answer: C
An async function always returns a promise. The await
still has to wait for the promise to resolve: a pending promise gets returned when we call getData()
in order to set data
equal to it.
If we wanted to get access to the resolved value "I made it"
, we could have used the .then()
method on data
:
data.then(res => console.log(res))
This would've logged "I made it!"
#74. What's the output?
function addToList(item, list) {
return list.push(item);
}
const result = addToList('apple', ['banana']);
console.log(result);
javascript
- A:
['apple', 'banana']
- B:
2
- C:
true
- D:
undefined
Answer
Answer: B
The .push()
method returns the length of the new array! Previously, the array contained one element (the string "banana"
) and had a length of 1
. After adding the string "apple"
to the array, the array contains two elements, and has a length of 2
. This gets returned from the addToList
function.
The push
method modifies the original array. If you wanted to return the array from the function rather than the length of the array, you should have returned list
after pushing item
to it.
#75. What's the output?
const box = { x: 10, y: 20 };
Object.freeze(box);
const shape = box;
shape.x = 100;
console.log(shape);
javascript
- A:
{ x: 100, y: 20 }
- B:
{ x: 10, y: 20 }
- C:
{ x: 100 }
- D:
ReferenceError
Answer
Answer: B
Object.freeze
makes it impossible to add, remove, or modify properties of an object (unless the property's value is another object).
When we create the variable shape
and set it equal to the frozen object box
, shape
also refers to a frozen object. You can check whether an object is frozen by using Object.isFrozen
. In this case, Object.isFrozen(shape)
returns true, since the variable shape
has a reference to a frozen object.
Since shape
is frozen, and since the value of x
is not an object, we cannot modify the property x
. x
is still equal to 10
, and { x: 10, y: 20 }
gets logged.
#76. What's the output?
const { name: myName } = { name: 'Lydia' };
console.log(name);
javascript
- A:
"Lydia"
- B:
"myName"
- C:
undefined
- D:
ReferenceError
Answer
Answer: C
When we unpack the property name
from the object on the right-hand side, we assign its value "Lydia"
to a variable with the name myName
.
With { name: myName }
, we tell JavaScript that we want to create a new variable called myName
with the value of the name
property on the right-hand side.
Since we try to log name
, a variable that is not defined, undefined
is returned on the left side assignment. Later, the value of Lydia
is stored through the destructuring assignment.
#77. Is this a pure function?
function sum(a, b) {
return a + b;
}
javascript
- A: Yes
- B: No
Answer
Answer: A
A pure function is a function that always returns the same result, if the same arguments are passed.
The sum
function always returns the same result. If we pass 1
and 2
, it will always return 3
without side effects. If we pass 5
and 10
, it will always return 15
, and so on. This is the definition of a pure function.
#78. What is the output?
const add = () => {
const cache = {};
return (num) => {
if (num in cache) {
return `From cache! ${cache[num]}`;
} else {
const result = num + 10;
cache[num] = result;
return `Calculated! ${result}`;
}
};
};
const addFunction = add();
console.log(addFunction(10));
console.log(addFunction(10));
console.log(addFunction(5 * 2));
javascript
- A:
Calculated! 20
Calculated! 20
Calculated! 20
- B:
Calculated! 20
From cache! 20
Calculated! 20
- C:
Calculated! 20
From cache! 20
From cache! 20
- D:
Calculated! 20
From cache! 20
Error
Answer
Answer: C
The add
function is a memoized function. With memoization, we can cache the results of a function in order to speed up its execution. In this case, we create a cache
object that stores the previously returned values.
If we call the addFunction
function again with the same argument, it first checks whether it has already gotten that value in its cache. If that's the case, the caches value will be returned, which saves on execution time. Else, if it's not cached, it will calculate the value and store it afterwards.
We call the addFunction
function three times with the same value: on the first invocation, the value of the function when num
is equal to 10
isn't cached yet. The condition of the if-statement num in cache
returns false
, and the else block gets executed: Calculated! 20
gets logged, and the value of the result gets added to the cache object. cache
now looks like { 10: 20 }
.
The second time, the cache
object contains the value that gets returned for 10
. The condition of the if-statement num in cache
returns true
, and 'From cache! 20'
gets logged.
The third time, we pass 5 * 2
to the function which gets evaluated to 10
. The cache
object contains the value that gets returned for 10
. The condition of the if-statement num in cache
returns true
, and 'From cache! 20'
gets logged.
#79. What is the output?
const myLifeSummedUp = ['☕', '💻', '🍷', '🍫'];
for (let item in myLifeSummedUp) {
console.log(item);
}
for (let item of myLifeSummedUp) {
console.log(item);
}
javascript
- A:
0
1
2
3
and"☕"
"💻"
"🍷"
"🍫"
- B:
"☕"
"💻"
"🍷"
"🍫"
and"☕"
"💻"
"🍷"
"🍫"
- C:
"☕"
"💻"
"🍷"
"🍫"
and0
1
2
3
- D:
0
1
2
3
and{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}
Answer
Answer: A
With a for-in loop, we can iterate over enumerable properties. In an array, the enumerable properties are the "keys" of array elements, which are actually their indexes. You could see an array as:
{0: "☕", 1: "💻", 2: "🍷", 3: "🍫"}
Where the keys are the enumerable properties. 0
1
2
3
get logged.
With a for-of loop, we can iterate over iterables. An array is an iterable. When we iterate over the array, the variable "item" is equal to the element it's currently iterating over, "☕"
"💻"
"🍷"
"🍫"
get logged.
#80. What is the output?
const list = [1 + 2, 1 * 2, 1 / 2];
console.log(list);
javascript
- A:
["1 + 2", "1 * 2", "1 / 2"]
- B:
["12", 2, 0.5]
- C:
[3, 2, 0.5]
- D:
[1, 1, 1]
Answer
Answer: C
Array elements can hold any value. Numbers, strings, objects, other arrays, null, boolean values, undefined, and other expressions such as dates, functions, and calculations.
The element will be equal to the returned value. 1 + 2
returns 3
, 1 * 2
returns 2
, and 1 / 2
returns 0.5
.