136. 以下哪一项会对对象person有副作用?

const person = { name: "Lydia Hallie" };

Object.seal(person);

155个JavaScript基础问题(136-145)_技术

答:A,首先我们要明白Object.seal的作用,是防止添加新属性或者对原有属性进行删除,B属于添加新属性,C属于删除原有属性,D属于将所有可枚举对象的属性的值从源对象分配到目标对象,并返回目标对象,所以属于添加,所以只有A项对person对象产生了副作用。

137. 以下哪一项会对对象person产生副作用?

const person = {
	name: "Lydia Hallie",
	address: {
		street: "100 Main St"
	}
};

Object.freeze(person);

155个JavaScript基础问题(136-145)_目标对象_02

答:C,本题考查我们对Object.freeze这个API的用法的了解程度,这个冻结属于浅冻结,所以对内部对象的属性是可以修改的,比如这个street属性。

138. 输出什么?

const add = x => x + x;

function myFunc(num = 2, value = add(num)) {
	console.log(num, value);
}

myFunc();
myFunc(3);

155个JavaScript基础问题(136-145)_迭代_03

答:A,本题没什么坑,就是考查我们对默认传参的了解。

139. 输出什么?

class Counter {
  #number = 10

  increment() {
    this.#number++
  }

  getNum() {
    return this.#number
  }
}

const counter = new Counter()
counter.increment()

console.log(counter.#number)

155个JavaScript基础问题(136-145)_数组_04

答:D,本题考查的是ES2020的新特性,访问类的私有属性,不能通过实例直接调用,可以通过实例的方法获取到,所以选D。

140. 选择哪一个?

const teams = [
	{ name: "Team 1", members: ["Paul", "Lisa"] },
	{ name: "Team 2", members: ["Laura", "Tim"] }
];

function* getMembers(members) {
	for (let i = 0; i < members.length; i++) {
		yield members[i];
	}
}

function* getTeams(teams) {
	for (let i = 0; i < teams.length; i++) {
		// ✨ SOMETHING IS MISSING HERE ✨
	}
}

const obj = getTeams(teams);
obj.next(); // { value: "Paul", done: false }
obj.next(); // { value: "Lisa", done: false }

155个JavaScript基础问题(136-145)_目标对象_05

答:B,本题主要是考查我们队yield和yield* 的认知,yield返回的是一个值,yield*则是将函数委托到另一个生成器函数或可迭代对象,显然本题适用于后者,所以选B。

141. 输出什么?

const person = {
	name: "Lydia Hallie",
	hobbies: ["coding"]
};

function addHobby(hobby, hobbies = person.hobbies) {
	hobbies.push(hobby);
	return hobbies;
}

addHobby("running", []);
addHobby("dancing");
addHobby("baking", person.hobbies);

console.log(person.hobbies);

155个JavaScript基础问题(136-145)_迭代_06

答:C,本题还是考查默认传参和实际传参的区别,running加不到数组hobbies中是因为,传递了实参空数组,其余的都是传递了person对象的引用,则能够添加进去,所以选C。

142. 输出什么?

class Bird {
	constructor() {
		console.log("I'm a bird. ????");
	}
}

class Flamingo extends Bird {
	constructor() {
		console.log("I'm pink. ????");
		super();
	}
}

const pet = new Flamingo();

155个JavaScript基础问题(136-145)_迭代_07

答:B,本题考查我们对继承的理解,首先会调用子类的构造函数,其次调用父类的构造函数,所以打印的是B。

143. 哪一个选项会导致报错?

const emojis = ["????", "????????", "????", "⭐"];

/* 1 */ emojis.push("????");
/* 2 */ emojis.splice(0, 2);
/* 3 */ emojis = [...emojis, "????"];
/* 4 */ emojis.length = 0;

155个JavaScript基础问题(136-145)_目标对象_08

答:D,长度属性是可以修改的,所以第4个并没有错,第三个错在对emojis的地址进行修改,这是不允许的,因为这是const关键字修饰的。

144. 我们需要向person对象添加什么,以致执行 […person] 时获得形如 [“Lydia Hallie”, 21] 的输出?

const person = {
  name: "Lydia Hallie",
  age: 21
}

[...person] // ["Lydia Hallie", 21]

155个JavaScript基础问题(136-145)_迭代_09

答:C,本题需要添加迭代器来定义迭代规则,对象默认并不是可迭代的,在添加规则的时候,生成器对象一定要yield* Object.values.

145. 输出什么?

let count = 0;
const nums = [0, 1, 2, 3];

nums.forEach(num => {
	if (num) count += 1
})

console.log(count)

155个JavaScript基础问题(136-145)_目标对象_10

答:C,当num为0的时候,count并不加,所以总共加了三次,选C。

题目来源

https://github.com/lydiahallie/javascript-questions