Question 61 - 70
#61. What's the output?
const person = { name: 'Lydia' };
Object.defineProperty(person, 'age', { value: 21 });
console.log(person);
console.log(Object.keys(person));
javascript
- A:
{ name: "Lydia", age: 21 }
,["name", "age"]
- B:
{ name: "Lydia", age: 21 }
,["name"]
- C:
{ name: "Lydia"}
,["name", "age"]
- D:
{ name: "Lydia"}
,["age"]
Answer
Answer: B
With the defineProperty
method, we can add new properties to an object, or modify existing ones. When we add a property to an object using the defineProperty
method, they are by default not enumerable. The Object.keys
method returns all enumerable property names from an object, in this case only "name"
.
Properties added using the defineProperty
method are immutable by default. You can override this behavior using the writable
, configurable
and enumerable
properties. This way, the defineProperty
method gives you a lot more control over the properties you're adding to an object.
#62. What's the output?
const settings = {
username: 'lydiahallie',
level: 19,
health: 90,
};
const data = JSON.stringify(settings, ['level', 'health']);
console.log(data);
javascript
- A:
"{"level":19, "health":90}"
- B:
"{"username": "lydiahallie"}"
- C:
"["level", "health"]"
- D:
"{"username": "lydiahallie", "level":19, "health":90}"
Answer
Answer: A
The second argument of JSON.stringify
is the replacer. The replacer can either be a function or an array, and lets you control what and how the values should be stringified.
If the replacer is an array, only the property names included in the array will be added to the JSON string. In this case, only the properties with the names "level"
and "health"
are included, "username"
is excluded. data
is now equal to "{"level":19, "health":90}"
.
If the replacer is a function, this function gets called on every property in the object you're stringifying. The value returned from this function will be the value of the property when it's added to the JSON string. If the value is undefined
, this property is excluded from the JSON string.
#63. What's the output?
let num = 10;
const increaseNumber = () => num++;
const increasePassedNumber = (number) => number++;
const num1 = increaseNumber();
const num2 = increasePassedNumber(num1);
console.log(num1);
console.log(num2);
javascript
- A:
10
,10
- B:
10
,11
- C:
11
,11
- D:
11
,12
Answer
Answer: A
The unary operator ++
first returns the value of the operand, then increments the value of the operand. The value of num1
is 10
, since the increaseNumber
function first returns the value of num
, which is 10
, and only increments the value of num
afterwards.
num2
is 10
, since we passed num1
to the increasePassedNumber
. number
is equal to 10
(the value of num1
. Again, the unary operator ++
first returns the value of the operand, then increments the value of the operand. The value of number
is 10
, so num2
is equal to 10
.
#64. What's the output?
const value = { number: 10 };
const multiply = (x = { ...value }) => {
console.log((x.number *= 2));
};
multiply();
multiply();
multiply(value);
multiply(value);
javascript
- A:
20
,40
,80
,160
- B:
20
,40
,20
,40
- C:
20
,20
,20
,40
- D:
NaN
,NaN
,20
,40
Answer
Answer: C
In ES6, we can initialize parameters with a default value. The value of the parameter will be the default value, if no other value has been passed to the function, or if the value of the parameter is "undefined"
. In this case, we spread the properties of the value
object into a new object, so x
has the default value of { number: 10 }
.
The default argument is evaluated at call time! Every time we call the function, a new object is created. We invoke the multiply
function the first two times without passing a value: x
has the default value of { number: 10 }
. We then log the multiplied value of that number, which is 20
.
The third time we invoke multiply, we do pass an argument: the object called value
. The *=
operator is actually shorthand for x.number = x.number * 2
: we modify the value of x.number
, and log the multiplied value 20
.
The fourth time, we pass the value
object again. x.number
was previously modified to 20
, so x.number *= 2
logs 40
.
#65. What's the output?
[1, 2, 3, 4].reduce((x, y) => console.log(x, y));
javascript
- A:
1
2
and3
3
and6
4
- B:
1
2
and2
3
and3
4
- C:
1
undefined
and2
undefined
and3
undefined
and4
undefined
- D:
1
2
andundefined
3
andundefined
4
Answer
Answer: D
The first argument that the reduce
method receives is the accumulator, x
in this case. The second argument is the current value, y
. With the reduce method, we execute a callback function on every element in the array, which could ultimately result in one single value.
In this example, we are not returning any values, we are simply logging the values of the accumulator and the current value.
The value of the accumulator is equal to the previously returned value of the callback function. If you don't pass the optional initialValue
argument to the reduce
method, the accumulator is equal to the first element on the first call.
On the first call, the accumulator (x
) is 1
, and the current value (y
) is 2
. We don't return from the callback function, we log the accumulator and current value: 1
and 2
get logged.
If you don't return a value from a function, it returns undefined
. On the next call, the accumulator is undefined
, and the current value is 3
. undefined
and 3
get logged.
On the fourth call, we again don't return from the callback function. The accumulator is again undefined
, and the current value is 4
. undefined
and 4
get logged.
#66. With which constructor can we successfully extend the Dog
class?
class Dog {
constructor(name) {
this.name = name;
}
};
class Labrador extends Dog {
// 1
constructor(name, size) {
this.size = size;
}
// 2
constructor(name, size) {
super(name);
this.size = size;
}
// 3
constructor(size) {
super(name);
this.size = size;
}
// 4
constructor(name, size) {
this.name = name;
this.size = size;
}
};
javascript
- A: 1
- B: 2
- C: 3
- D: 4
Answer
Answer: B
In a derived class, you cannot access the this
keyword before calling super
. If you try to do that, it will throw a ReferenceError: 1 and 4 would throw a reference error.
With the super
keyword, we call that parent class's constructor with the given arguments. The parent's constructor receives the name
argument, so we need to pass name
to super
.
The Labrador
class receives two arguments, name
since it extends Dog
, and size
as an extra property on the Labrador
class. They both need to be passed to the constructor function on Labrador
, which is done correctly using constructor 2.
#67. What's the output?
// index.js
console.log('running index.js');
import { sum } from './sum.js';
console.log(sum(1, 2));
// sum.js
console.log('running sum.js');
export const sum = (a, b) => a + b;
javascript
- A:
running index.js
,running sum.js
,3
- B:
running sum.js
,running index.js
,3
- C:
running sum.js
,3
,running index.js
- D:
running index.js
,undefined
,running sum.js
Answer
Answer: B
With the import
keyword, all imported modules are pre-parsed. This means that the imported modules get run first, the code in the file which imports the module gets executed after.
This is a difference between require()
in CommonJS and import
! With require()
, you can load dependencies on demand while the code is being run. If we would have used require
instead of import
, running index.js
, running sum.js
, 3
would have been logged to the console.
#68. What's the output?
console.log(Number(2) === Number(2));
console.log(Boolean(false) === Boolean(false));
console.log(Symbol('foo') === Symbol('foo'));
javascript
- A:
true
,true
,false
- B:
false
,true
,false
- C:
true
,false
,true
- D:
true
,true
,true
Answer
Answer: A
Every Symbol is entirely unique. The purpose of the argument passed to the Symbol is to give the Symbol a description. The value of the Symbol is not dependent on the passed argument. As we test equality, we are creating two entirely new symbols: the first Symbol('foo')
, and the second Symbol('foo')
. These two values are unique and not equal to each other, Symbol('foo') === Symbol('foo')
returns false
.
#69. What's the output?
const name = 'Lydia Hallie';
console.log(name.padStart(13));
console.log(name.padStart(2));
javascript
- A:
"Lydia Hallie"
,"Lydia Hallie"
- B:
" Lydia Hallie"
," Lydia Hallie"
("[13x whitespace]Lydia Hallie"
,"[2x whitespace]Lydia Hallie"
) - C:
" Lydia Hallie"
,"Lydia Hallie"
("[1x whitespace]Lydia Hallie"
,"Lydia Hallie"
) - D:
"Lydia Hallie"
,"Lyd"
,
Answer
Answer: C
With the padStart
method, we can add padding to the beginning of a string. The value passed to this method is the total length of the string together with the padding. The string "Lydia Hallie"
has a length of 12
. name.padStart(13)
inserts 1 space at the start of the string, because 12 + 1 is 13.
If the argument passed to the padStart
method is smaller than the length of the array, no padding will be added.
#70. What's the output?
console.log('🥑' + '💻');
javascript
- A:
"🥑💻"
- B:
257548
- C: A string containing their code points
- D: Error
Answer
Answer: A
With the +
operator, you can concatenate strings. In this case, we are concatenating the string "🥑"
with the string "💻"
, resulting in "🥑💻"
.