ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript スキルを向上させるための 10 のクイズの質問と回答を共有します

JavaScript スキルを向上させるための 10 のクイズの質問と回答を共有します

青灯夜游
リリース: 2020-06-20 09:16:48
転載
1664 人が閲覧しました

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()
);
ログイン後にコピー

答えと分析

##答え:

true、true、false

ここではいくつかの概念が関係しています。まず、配列の sort

メソッドは元の配列をソートし、配列への参照を返します。これは、

arr2.sort() を呼び出すと、arr2 配列内のオブジェクトが並べ替えられることを意味します。 オブジェクトを比較する場合、配列の並べ替え順序は重要ではありません。 arr1.sort()

arr1 はメモリ内の同じオブジェクトを指しているため、最初の等価性テストは true を返します。 2 番目の比較についても同様です。arr2.sort() と arr2 はメモリ内の同じオブジェクトを指します。 3 番目のテストでは、arr1.sort()

arr2.sort() の並べ替え順序は同じですが、メモリ内の異なるオブジェクトを指します。したがって、3 番目のテストは false と評価されます。

2. オブジェクトの設定

次の Set

オブジェクトを新しい配列に変換し、最終的な出力は何になりますか? ?

const mySet = new Set([{ a: 1 }, { a: 1 }]);
const result = [...mySet];
console.log(result);
ログイン後にコピー
答えと分析

答え:

[{a: 1 }, {a: 1}]Set オブジェクトは重複を削除しますが、Set で作成する 2 つの値は、同じキーと値のペアであっても、メモリ内の異なるオブジェクトへの参照です。 。これは、 { a: 1 } === { a: 1 }

の結果が

false になるのと同じ理由です。 セットがオブジェクト変数を使用して作成された場合、たとえば obj = {a: 1}

new Set([obj, obj]) には 1 つだけが含まれます。 element 。配列内の両方の要素がメモリ内の同じオブジェクトを参照するためです。

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);
ログイン後にコピー

#答えと分析

答え: スイセン

Object.freeze はオブジェクトを浅くフリーズしますが、深いプロパティの変更は保護しません。この例では、user.age

は変更できませんが、

user.pet.name は問題なく変更できます。オブジェクトが「最初から最後まで」変更されないように保護する必要があると思われる場合は、Object.freeze を再帰的に適用するか、既存の「ディープ フリーズ」ライブラリを使用できます。 4. プロトタイプの継承

次のコードには、Dog コンストラクターがあります。うちの犬は明らかに話す操作を持っています。 Pogo の speech を呼び出したときの出力は何でしょうか?

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());
ログイン後にコピー

答えと分析

答え: すごい

每次创建一个新的 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート