>웹 프론트엔드 >JS 튜토리얼 >JavaScript 기술을 향상시키기 위한 10가지 퀴즈 질문과 답변을 공유하세요

JavaScript 기술을 향상시키기 위한 10가지 퀴즈 질문과 답변을 공유하세요

青灯夜游
青灯夜游앞으로
2020-06-20 09:12:241659검색

JavaScript 기술을 향상시키기 위한 10가지 퀴즈 질문과 답변을 공유하세요

질문을 포장하는 것은 실력을 향상시키는 좋은 방법입니다. 아래 질문은 도전적이고 "지침"입니다. 대답하는 방법을 안다면 꽤 괜찮다는 뜻이지만, 잘못 대답했다는 사실을 알고 왜 틀렸는지 알아낼 수 있다면 그게 더 좋은 것 같아요!

추천 학습: JavaScript 비디오 튜토리얼 , js 튜토리얼 (그림 및 텍스트)

1. 배열 정렬 비교

다음 배열을 보세요. 다양한 정렬 작업 후 출력은 무엇입니까?

const arr1 = ['a', 'b', 'c'];
const arr2 = ['b', 'c', 'a'];

console.log(
  arr1.sort() === arr1,
  arr2.sort() == arr2,
  arr1.sort() === arr2.sort()
);

답변 및 분석

답변: 참, 참, 거짓

여기에는 몇 가지 개념이 있습니다. 먼저, 배열의 sort 메소드는 원래 배열을 정렬하고 배열에 대한 참조를 반환합니다. 이는 arr2.sort()를 호출하면 arr2 배열의 객체가 정렬된다는 의미입니다. sort 方法对原始数组进行排序,并返回对该数组的引用。这意味着当你调用 arr2.sort() 时,arr2 数组内的对象将会被排序。

当你比较对象时,数组的排序顺序并不重要。由于 arr1.sort()arr1 指向内存中的同一对象,因此第一个相等测试返回 true。第二个比较也是如此:arr2.sort() 和 arr2 指向内存中的同一对象。

在第三个测试中,arr1.sort()arr2.sort() 的排序顺序相同;但是,它们指向内存中的不同对象。因此,第三个测试的评估结果为 false

2. set 的对象

把下面的 Set

객체를 비교할 때 배열의 정렬 순서는 중요하지 않습니다. arr1.sort()arr1은 메모리의 동일한 객체를 가리키므로 첫 번째 동일성 테스트는 true를 반환합니다. 두 번째 비교에서도 마찬가지입니다. arr2.sort()와 arr2는 메모리의 동일한 객체를 가리킵니다.

세 번째 테스트에서 arr1.sort()arr2.sort()의 정렬 순서는 동일하지만 메모리의 다른 개체를 가리킵니다. 따라서 세 번째 테스트는 false로 평가됩니다.

2. Set object

다음 Set 개체를 새로운 배열로 변환하세요. [{a: 1}, {a: 1}]

尽管 Set 对象确实会删除重复项,但是我们用 Set 创建的两个值是对内存中不同对象的引用,尽管它们有相同的键值对。这与  { a: 1 } === { a: 1 } 的结果为 false 的原因相同。

如果集合是用对象变量创建的,例如 obj = {a: 1}new Set([obj,obj]) 将会只有一个元素,因为数组中的两个元素都引用了内存中的同一对象。

3. 深层对象的可变性

下面的对象代表用户 Joe 和他的狗 Buttercup。我们用 Object.freeze

const mySet = new Set([{ a: 1 }, { a: 1 }]);
const result = [...mySet];
console.log(result);

답변 및 설명

답변:

[{a: 1}, {a: 1}]Set 개체가 중복 항목을 제거하지만 두 Set으로 생성한 값은 키-값 쌍이 동일하더라도 메모리의 다른 개체에 대한 참조입니다. 이는 { a: 1 } === { a: 1 } 결과가 false인 이유와 같습니다.

세트가 개체 변수를 사용하여 생성된 경우(예: obj = {a: 1}), new Set([obj, obj])에는 요소가 하나만 있습니다. 배열의 두 요소 모두 메모리의 동일한 개체를 참조합니다. Object.freeze 将会使对象浅冻结,但不会保护深层属性不被修改。在这个例子中,不能对 user.age 进行修改,但是对 user.pet.name 进行修改却没有问题。如果我们觉得需要保护一个对象,避免其“从头到尾”发生改变,则可以递归地应用 Object.freeze 或使用现有的“深度冻结”库。

4. 原型继承

在下面的代码中,有一个 Dog

3. 딥 객체의 가변성

아래 객체는 사용자 Joe와 그의 개 Buttercup을 나타냅니다. Object.freeze를 사용하여 개체를 저장한 다음 Buttercup의 이름을 변경해 봅니다. 최종 출력은 무엇입니까?

const user = {
  name: 'Joe',
  age: 25,
  pet: {
    type: 'dog',
    name: 'Buttercup',
  },
};

Object.freeze(user);

user.pet.name = 'Daffodil';

console.log(user.pet.name);

🎜답변 및 설명🎜🎜🎜🎜답변: 🎜Daffodil🎜🎜Object.freeze는 개체를 얕은 동결하지만 깊은 속성이 수정되는 것을 보호하지는 않습니다. 이 예에서 user.age는 수정할 수 없지만 user.pet.name은 문제 없이 수정할 수 있습니다. 객체가 "위에서 아래로" 변경되는 것을 방지해야 한다고 생각되면 Object.freeze를 재귀적으로 적용하거나 기존 "deep Freeze" 라이브러리를 사용할 수 있습니다. 🎜🎜🎜🎜4. 프로토타입 상속 🎜🎜🎜🎜아래 코드에는 Dog 생성자가 있습니다. 우리 개는 분명히 말하는 능력을 가지고 있습니다. Pogo의 Speak를 호출하면 어떤 결과가 나오나요? 🎜🎜🎜🎜🎜
function Dog(name) {
  this.name = name;
  this.speak = function() {
    return 'woof';
  };
}

const dog = new Dog('Pogo');

Dog.prototype.speak = function() {
  return 'arf';
};

console.log(dog.speak());
🎜🎜답변 및 분석🎜🎜🎜🎜답변: 🎜woof🎜

每次创建一个新的 Dog 实例时,我们都会将该实例的 speak 属性设置为返回字符串 woof 的函数。由于每次我们创建一个新的Dog实例时都要设置该值,因此解释器不会沿着原型链去找 speak 属性。结果就不会使用 Dog.prototype.speak 上的  speak 方法。

5. Promise.all 的解决顺序

在这个问题中,我们有一个 timer 函数,它返回一个 Promise ,该 Promise 在随机时间后解析。我们用 Promise.all 解析一系列的 timer。最后的输出是什么,是随机的吗?

const timer = a => {
  return new Promise(res =>
    setTimeout(() => {
      res(a);
    }, Math.random() * 100)
  );
};

const all = Promise.all([timer('first'), timer('second')]).then(data =>
  console.log(data)
);

答案和解析

答案: ["first", "second"]

Promise 解决的顺序与 Promise.all 无关。我们能够可靠地依靠它们按照数组参数中提供的相同顺序返回。

6. Reduce 数学

数学时间!输出什么?

const arr = [x => x * 1, x => x * 2, x => x * 3, x => x * 4];

console.log(arr.reduce((agg, el) => agg + el(agg), 1));

答案和解析

答案: 120

使用 Array#reduce 时,聚合器的初始值(在此称为 agg)在第二个参数中给出。在这种情况下,该值为 1。然后可以如下迭代函数:

1 + 1 * 1 = 2(下一次迭代中聚合器的值)

2 + 2 * 2 = 6(下一次迭代中聚合器的值)

6 + 6 * 3 = 24(下一次迭代中聚合器的值)

24 + 24 * 4 = 120(最终值)

因此它是 120。

7. 短路通知(Short-Circuit Notification(s))

让我们向用户显示一些通知。以下代码段输出了什么?

const notifications = 1;

console.log(
  `You have ${notifications} notification${notifications !== 1 && 's'}`
);

答案和解析

答案:“You have 1 notificationfalse”

不幸的是,我们的短路评估将无法按预期工作: notifications !== 1 && 's'  评估为 false,这意味着我们实际上将会输出 You have 1 notificationfalse。如果希望代码段正常工作,则可以考虑条件运算符: ${notifications === 1 ? '' : 's'}

8. 展开操作和重命名

查看以下代码中有单个对象的数组。当我们扩展该数组并更改 0 索引对象上的 firstname 属性时会发生什么?

const arr1 = [{ firstName: 'James' }];
const arr2 = [...arr1];
arr2[0].firstName = 'Jonah';

console.log(arr1);

答案和解析

答案: [{ firstName: "Jonah" }]

展开操作符会创建数组的浅表副本,这意味着 arr2 中包含的对象与 arr1 所指向的对象相同。所以在一个数组中修改对象的 firstName 属性,也将会在另一个数组中更改。

9. 数组方法绑定

在以下情况下会输出什么?

const map = ['a', 'b', 'c'].map.bind([1, 2, 3]);
map(el => console.log(el));

答案和解析

答案: 1 2 3

['a', 'b', 'c'].map 被调用时,将会调用 this' 值为 '['a','b','c']Array.prototype.map。但是当用作 引用 时, Array.prototype.map 的引用。

Function.prototype.bind 会将函数的 this 绑定到第一个参数(在本例中为 [1, 2, 3]),用 this 调用Array.prototype.map 将会导致这些项目被迭代并输出。

10. set 的唯一性和顺序

在下面的代码中,我们用 set 对象和扩展语法创建了一个新数组,最后会输出什么?

const arr = [...new Set([3, 1, 2, 3, 4])];
console.log(arr.length, arr[2]);

答案和解析

答案: 4  2

set 对象会强制里面的元素唯一(集合中已经存在的重复元素将会被忽略),但是不会改变顺序。所以 arr 数组的内容是 [3,1,2,4]arr.length4,且 arr[2](数组的第三个元素)为 2

英文原文地址:https://typeofnan.dev/10-javascript-quiz-questions-and-answers/

作者:Nick Scialli

想要获取炫酷的页面特效,可访问:js代码特效 栏目!!

위 내용은 JavaScript 기술을 향상시키기 위한 10가지 퀴즈 질문과 답변을 공유하세요의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제