Question 51 - 60
#51. What's the output?
function getInfo(member, year) {
member.name = 'Lydia';
year = '1998';
}
const person = { name: 'Sarah' };
const birthYear = '1997';
getInfo(person, birthYear);
console.log(person, birthYear);
javascript
- A:
{ name: "Lydia" }, "1997"
- B:
{ name: "Sarah" }, "1998"
- C:
{ name: "Lydia" }, "1998"
- D:
{ name: "Sarah" }, "1997"
Answer
Answer: A
Arguments are passed by value, unless their value is an object, then they're passed by reference. birthYear
is passed by value, since it's a string, not an object. When we pass arguments by value, a copy of that value is created (see question 46).
The variable birthYear
has a reference to the value "1997"
. The argument year
also has a reference to the value "1997"
, but it's not the same value as birthYear
has a reference to. When we update the value of year
by setting year
equal to "1998"
, we are only updating the value of year
. birthYear
is still equal to "1997"
.
The value of person
is an object. The argument member
has a (copied) reference to the same object. When we modify a property of the object member
has a reference to, the value of person
will also be modified, since they both have a reference to the same object. person
's name
property is now equal to the value "Lydia"
#52. What's the output?
function greeting() {
throw 'Hello world!';
}
function sayHi() {
try {
const data = greeting();
console.log('It worked!', data);
} catch (e) {
console.log('Oh no an error:', e);
}
}
sayHi();
javascript
- A:
It worked! Hello world!
- B:
Oh no an error: undefined
- C:
SyntaxError: can only throw Error objects
- D:
Oh no an error: Hello world!
Answer
Answer: D
With the throw
statement, we can create custom errors. With this statement, you can throw exceptions. An exception can be a string, a number, a boolean or an object. In this case, our exception is the string 'Hello world!'
.
With the catch
statement, we can specify what to do if an exception is thrown in the try
block. An exception is thrown: the string 'Hello world!'
. e
is now equal to that string, which we log. This results in 'Oh an error: Hello world!'
.
#53. What's the output?
function Car() {
this.make = 'Lamborghini';
return { make: 'Maserati' };
}
const myCar = new Car();
console.log(myCar.make);
javascript
- A:
"Lamborghini"
- B:
"Maserati"
- C:
ReferenceError
- D:
TypeError
Answer
Answer: B
When you return a property, the value of the property is equal to the returned value, not the value set in the constructor function. We return the string "Maserati"
, so myCar.make
is equal to "Maserati"
.
#54. What's the output?
(() => {
let x = (y = 10);
})();
console.log(typeof x);
console.log(typeof y);
javascript
- A:
"undefined", "number"
- B:
"number", "number"
- C:
"object", "number"
- D:
"number", "undefined"
Answer
Answer: A
let x = (y = 10);
is actually shorthand for:
y = 10;
let x = y;
javascript
When we set y
equal to 10
, we actually add a property y
to the global object (window
in browser, global
in Node). In a browser, window.y
is now equal to 10
.
Then, we declare a variable x
with the value of y
, which is 10
. Variables declared with the let
keyword are block scoped, they are only defined within the block they're declared in; the immediately invoked function expression (IIFE) in this case. When we use the typeof
operator, the operand x
is not defined: we are trying to access x
outside of the block it's declared in. This means that x
is not defined. Values who haven't been assigned a value or declared are of type "undefined"
. console.log(typeof x)
returns "undefined"
.
However, we created a global variable y
when setting y
equal to 10
. This value is accessible anywhere in our code. y
is defined, and holds a value of type "number"
. console.log(typeof y)
returns "number"
.
#55. What's the output?
class Dog {
constructor(name) {
this.name = name;
}
}
Dog.prototype.bark = function () {
console.log(`Woof I am ${this.name}`);
};
const pet = new Dog('Mara');
pet.bark();
delete Dog.prototype.bark;
pet.bark();
javascript
- A:
"Woof I am Mara"
,TypeError
- B:
"Woof I am Mara"
,"Woof I am Mara"
- C:
"Woof I am Mara"
,undefined
- D:
TypeError
,TypeError
Answer
Answer: A
We can delete properties from objects using the delete
keyword, also on the prototype. By deleting a property on the prototype, it is not available anymore in the prototype chain. In this case, the bark
function is not available anymore on the prototype after delete Dog.prototype.bark
, yet we still try to access it.
When we try to invoke something that is not a function, a TypeError
is thrown. In this case TypeError: pet.bark is not a function
, since pet.bark
is undefined
.
#56. What's the output?
const set = new Set([1, 1, 2, 3, 4]);
console.log(set);
javascript
- A:
[1, 1, 2, 3, 4]
- B:
[1, 2, 3, 4]
- C:
{1, 1, 2, 3, 4}
- D:
{1, 2, 3, 4}
Answer
Answer: D
The Set
object is a collection of unique values: a value can only occur once in a set.
We passed the iterable [1, 1, 2, 3, 4]
with a duplicate value 1
. Since we cannot have two of the same values in a set, one of them is removed. This results in {1, 2, 3, 4}
.
#57. What's the output?
// counter.js
let counter = 10;
export default counter;
javascript
// index.js
import myCounter from './counter';
myCounter += 1;
console.log(myCounter);
javascript
- A:
10
- B:
11
- C:
Error
- D:
NaN
Answer
Answer: C
An imported module is read-only: you cannot modify the imported module. Only the module that exports them can change its value.
When we try to increment the value of myCounter
, it throws an error: myCounter
is read-only and cannot be modified.
#58. What's the output?
const name = 'Lydia';
age = 21;
console.log(delete name);
console.log(delete age);
javascript
- A:
false
,true
- B:
"Lydia"
,21
- C:
true
,true
- D:
undefined
,undefined
Answer
Answer: A
The delete
operator returns a boolean value: true
on a successful deletion, else it'll return false
. However, variables declared with the var
, const
or let
keyword cannot be deleted using the delete
operator.
The name
variable was declared with a const
keyword, so its deletion is not successful: false
is returned. When we set age
equal to 21
, we actually added a property called age
to the global object. You can successfully delete properties from objects this way, also the global object, so delete age
returns true
.
#59. What's the output?
const numbers = [1, 2, 3, 4, 5];
const [y] = numbers;
console.log(y);
javascript
- A:
[[1, 2, 3, 4, 5]]
- B:
[1, 2, 3, 4, 5]
- C:
1
- D:
[1]
Answer
Answer: C
We can unpack values from arrays or properties from objects through destructuring. For example:
[a, b] = [1, 2];
javascript
The value of a
is now 1
, and the value of b
is now 2
. What we actually did in the question, is:
[y] = [1, 2, 3, 4, 5];
javascript
This means that the value of y
is equal to the first value in the array, which is the number 1
. When we log y
, 1
is returned.
#60. What's the output?
const user = { name: 'Lydia', age: 21 };
const admin = { admin: true, ...user };
console.log(admin);
javascript
- A:
{ admin: true, user: { name: "Lydia", age: 21 } }
- B:
{ admin: true, name: "Lydia", age: 21 }
- C:
{ admin: true, user: ["Lydia", 21] }
- D:
{ admin: true }
Answer
Answer: B
It's possible to combine objects using the spread operator ...
. It lets you create copies of the key/value pairs of one object, and add them to another object. In this case, we create copies of the user
object, and add them to the admin
object. The admin
object now contains the copied key/value pairs, which results in { admin: true, name: "Lydia", age: 21 }
.