23 pertanyaan sulit untuk wawancara JavaScript

Ingin bersiap-siap untuk wawancara JavaScript dan sedang mencari pertanyaan untuk berlatih? Jika demikian - pertimbangkan bahwa pencarian Anda telah selesai. Penulis materi, terjemahan yang kami terbitkan hari ini, mengatakan bahwa ia telah mengumpulkan lebih dari dua lusin pertanyaan tentang JavaScript yang ditujukan bagi mereka yang ingin beralih dari junior menjadi senior, bagi mereka yang berusaha untuk berhasil melewati wawancara di bidang pengembangan front-end dan mendapatkan penawaran menarik dari karyawan.


gambar

1. Jelaskan Fitur Validasi Kesetaraan JavaScript


Kesulitan: *


JavaScript memiliki dua operator untuk memeriksa persamaan nilai. Yang pertama adalah yang disebut operator kesetaraan ketat. Yang kedua adalah operator kesetaraan non-ketat, yang dapat digunakan untuk mengkonversi jenis jumlah yang diperiksa.

  • Operator kesetaraan yang ketat ( ===) memeriksa nilai-nilai untuk kesetaraan tanpa melakukan konversi jenis.
  • Operator kesetaraan yang tidak ketat ( ==) memeriksa nilai-nilai untuk kesetaraan, mengubahnya menjadi tipe yang umum.

var a = "42";
var b = 42;

a == b;         // true
a === b;        // false

Berikut adalah beberapa panduan untuk menggunakan berbagai pemeriksa kesetaraan dalam JavaScript:

  • Jika salah satu nilai yang dibandingkan dapat berupa nilai trueatau false- cobalah untuk menghindari operator ==. Gunakan operator ===.
  • Gunakan operator ===dalam hal bahwa jika Anda bekerja dengan nilai-nilai berikut: 0, «»atau [](array kosong).
  • Dalam semua kasus lain, Anda dapat menggunakan operator dengan aman ==. Selain itu, ini tidak hanya aman, tetapi juga membantu menyederhanakan kode dan meningkatkan keterbacaannya.

β†’ Sumber

2. Berikan contoh casting ke tipe nilai logis yang tidak terkait dengan tipe ini


Kesulitan: ***


Inti dari pertanyaan ini adalah untuk mencari tahu nilai mana, dalam hal mengubahnya menjadi tipe logis, berubah menjadi false, dan yang mana - menjadi true.

Berikut adalah daftar nilai yang bisa disebut "falsy". Mereka, ketika mengkonversi ke tipe logis, berubah menjadi nilai false:

  • «» (baris kosong).
  • 0, -0, NaN(Bukan nomor).
  • null, undefined.

"Salah" adalah makna logis false.

Nilai apa pun yang tidak termasuk dalam daftar ini, ketika dikonversi ke jenis logis, berubah menjadi true(nilai-nilai tersebut disebut "benar" - benar). Contohnya:

  • Β«helloΒ».
  • 42.
  • [ ], [ 1, Β«2Β», 3 ](array).
  • { }, { a: 42 }(objek).
  • function foo() { .. } (fungsi).

"Benar" juga merupakan makna yang logis true.

β†’ Sumber

3. Apa itu IIFE?


Kesulitan: ***


IIFE (Ekspresi Fungsi Segera Diminta) adalah ekspresi fungsional segera dipanggil. Ungkapan seperti itu dieksekusi segera setelah penciptaan.

(function IIFE(){
    console.log( "Hello!" );
})();
// "Hello!"

Pola ini sering digunakan untuk mencegah polusi namespace global. Faktanya adalah bahwa variabel yang dideklarasikan dalam IIFE (seperti dalam fungsi biasa lainnya) tidak terlihat di luar fungsi ini.

β†’ Sumber

4. Kapan saya harus menggunakan fungsi panah yang muncul di ES6?


Kesulitan: ***


Berikut adalah aturan sederhana untuk menggunakan berbagai cara untuk mendeklarasikan fungsi yang saya ikuti ketika mengembangkan kode untuk lingkungan yang mendukung ES6 dan standar yang lebih baru:

  • Gunakan kata kunci functiondalam lingkup global dan untuk properti Object.prototype.
  • Gunakan kata kunci functionuntuk konstruktor objek.
  • Dalam kasus lain, gunakan fungsi panah.

Seperti yang Anda lihat, fungsi panah disarankan untuk digunakan di hampir semua tempat. Ada beberapa alasan untuk keadaan ini:

  • Pekerjaan yang nyaman dengan konteks. Fungsi panah menggunakan nilai thiskonteks sekitarnya tanpa memiliki sendiri this. Jika fungsi tersebut digunakan secara berurutan, tanpa menggunakan fungsi biasa dalam konstruksi yang kompleks, ini memastikan pekerjaan yang aman dengan konteksnya.
  • Kekompakan. Kode fungsi panah lebih mudah dimasukkan dan lebih mudah dibaca. Mungkin keunggulan fungsi panah ini daripada yang biasa bagi Anda akan tampak kontroversial dan tergantung pada sudut pandang masing-masing pengembang tertentu.
  • Kejelasan kode. Jika hampir semua kode diwakili oleh fungsi panah, setiap fungsi biasa dibedakan dalam kode tersebut dengan membuat konteksnya sendiri. Dengan menggunakan fungsi panah, programmer membuat kode yang lebih mudah dipahami di mana lebih mudah untuk dikerjakan daripada di kode tanpa fungsi panah this.

β†’ Sumber

5. Apa perbedaan antara kelas ES6 dan konstruktor fungsi?


Kesulitan: ***


Mari kita lihat beberapa contoh dulu.

Fungsi konstruktor:

function Person(name) {
  this.name = name;
}

Kelas ES6:

class Person {
  constructor(name) {
    this.name = name;
  }
}

Ketika membuat objek sederhana, konstruktor dan kelas yang digunakan untuk tujuan ini terlihat sangat mirip.

Perbedaan utama antara konstruktor dan kelas muncul saat menggunakan warisan. Jika kita perlu membuat kelas Studentyang merupakan subkelas dari kelas Persondan menambahkan bidang ke kelas baru ini studentId, maka ini adalah bagaimana kode di mana konstruktor digunakan dan kode di mana kelas digunakan akan terlihat seperti.

Fungsi konstruktor:

function Student(name, studentId) {
  //      ,   .
  Person.call(this, name);

  //    .
  this.studentId = studentId;
}

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Kelas ES6:

class Student extends Person {
  constructor(name, studentId) {
    super(name);
    this.studentId = studentId;
  }
}

β†’ Sumber

6. Ceritakan tentang metode Function.prototype.bind ().


Kesulitan: ***


Mengutip MDN: β€œMetode ini bind()menciptakan fungsi baru yang, ketika dipanggil, menetapkan nilai yang thisdisediakan sebagai konteks eksekusi . Set argumen juga diteruskan ke metode, yang akan ditetapkan sebelum argumen dilewatkan ke fungsi terikat ketika dipanggil. "

Saya percaya metode itu. bind()sangat berguna untuk mengikat nilai thisdalam metode kelas yang perlu diteruskan ke fungsi lain. Teknik ini sering digunakan dalam komponen Bereaksi.

β†’ Sumber 

7. Apa fungsi anonim yang biasa digunakan untuk?


Kesulitan: ***


Fungsi anonim digunakan untuk membuat konstruksi IIFE, variabel yang dideklarasikan di mana tidak mencemari lingkup global.

(function() {
  // - .
})();

Fungsi anonim digunakan sebagai fungsi panggilan balik, yang hanya digunakan di satu tempat program. Kode akan terlihat lebih mandiri dan dapat dibaca jika panggilan baliknya diumumkan tepat di tempat kode itu digunakan. Ini menghilangkan kebutuhan untuk melihat kode untuk mencari fungsi tubuh.

setTimeout(function() {
  console.log('Hello world!');
}, 1000);

Fungsi anonim mudah digunakan dalam konstruksi khusus untuk gaya pemrograman fungsional, atau ketika bekerja dengan perpustakaan seperti Lodash (use case ini mirip dengan penggunaannya sebagai panggilan balik).

const arr = [1, 2, 3];
const double = arr.map(function(el) {
  return el * 2;
});
console.log(double); // [2, 4, 6]

β†’ Sumber

8. Apa perbedaan antara metode Object.freeze () dan kata kunci const?


Kesulitan: ***


Kata kunci constdan metode Object.freeze()adalah hal yang sangat berbeda.

Kata kunci constberlaku untuk binding (ke "variabel"). Ini menciptakan ikatan yang tidak dapat diubah, yaitu, tidak constmungkin untuk mengikat sesuatu yang baru ke variabel (konstan) yang dinyatakan menggunakan kata kunci . Konstanta tidak dapat diberi nilai baru.

const person = {
    name: "Leonardo"
};
let animal = {
    species: "snake"
};
person = animal; // Uncaught TypeError: Assignment to constant variable.

Metode ini Object.freeze()bekerja dengan nilai. Atau lebih tepatnya, dengan nilai objek. Itu membuat objek tidak berubah, yang melindungi terhadap perubahan nilai properti dari objek ini.

let person = {
    name: "Leonardo"
};
Object.freeze(person);
person.name = "Lima"; // Uncaught TypeError: Cannot assign to read only property 'name' of object
console.log(person);

Harap dicatat bahwa pesan kesalahan ditampilkan dalam mode ketat. Dalam mode normal, operasi mengubah properti objek "beku" tidak berfungsi.

β†’ Sumber

9. Apa itu "generator"?


Kesulitan: ***


Generator adalah fungsi dari mana Anda dapat "keluar" dan ke mana Anda dapat "masuk" jika diperlukan. Konteks mereka (pengikatan variabel) dipertahankan antara sesi "entri" ke dalamnya. Generator dinyatakan menggunakan kata kunci function*. Fungsi seperti itu, ketika pertama kali dipanggil, tidak menjalankan kode, mengembalikan objek khusus, generator, yang memungkinkan Anda untuk mengontrol pelaksanaannya. Untuk mendapatkan nilai berikutnya yang dikeluarkan oleh generator, Anda perlu memanggil metode tersebut next(). Karena hal ini, kode fungsi dijalankan hingga menemukan kata kunci yieldyang mengembalikan nilai.

Fungsi generator dapat dipanggil sebanyak yang Anda suka. Setiap kali generator baru akan kembali. Tetapi setiap generator hanya dapat dilewati satu kali.

function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
    let iterationCount = 0;
    for (let i = start; i < end; i += step) {
        iterationCount++;
        yield i;
    }
    return iterationCount;
}

β†’ Sumber

10. Kapan generator harus digunakan?


Kesulitan: ***


Jika secara singkat menjelaskan fitur-fitur utama generator yang bermanfaat, ternyata mereka adalah sebagai berikut:

  • Kode di mana generator digunakan menentukan saat nilai selanjutnya diterima. Generator hanya bertanggung jawab untuk mengembalikan nilai, itu dikendalikan dari luar.
  • Ada generator asinkron. Mereka memungkinkan Anda untuk bekerja dengan aliran data yang tidak sinkron.

Hal utama dalam generator adalah bahwa Anda bisa mendapatkan nilai berikutnya yang dikembalikan oleh generator hanya ketika dibutuhkan dalam kode yang menggunakan generator. Generator tidak mengembalikan semuanya sekaligus. Dalam beberapa situasi, fitur ini mungkin sangat nyaman.

β†’ Sumber

11. Apa itu "meningkatkan variabel"?


Kesulitan: ****


Inti dari konsep "meningkatkan variabel" adalah iklan "naik" ke atas cakupan saat ini. Sebagai hasilnya, variabel dapat digunakan sebelum deklarasi. Hanya deklarasi variabel yang dimunculkan, tetapi bukan kode inisialisasi mereka. Perhatikan bahwa perilaku variabel yang dinyatakan menggunakan kata kunci varberbeda dari perilaku variabel dan konstanta yang dinyatakan menggunakan letdan const.

β†’ Sumber

12. Apa yang akan dihasilkan oleh kode berikut?


Kesulitan: ****


var output = (function(x) {
  delete x;
  return x;
})(0);

console.log(output);

Kode ini akan menampilkan 0. Operator deletedigunakan untuk menghapus properti objek. Dan x- ini bukan properti objek - ini adalah variabel lokal. Operator deletetidak mempengaruhi variabel lokal.

β†’ Sumber

13. Apa yang akan dihasilkan oleh kode berikut?


Kesulitan: ****


var Employee = {
  company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);

Kode ini akan menampilkan xyz. Properti companybukan properti objek emp1, tetapi properti prototipe. Operator deletetidak menghapus properti prototipe objek. Objek emp1tidak memiliki properti sendiri company. Anda dapat memverifikasi ini dengan:

console.log(emp1.hasOwnProperty('company')); // false

Jika kami masih perlu menghapus properti ini, Anda dapat melakukan ini dengan langsung menghubungi objek Employee( delete Employee.company), atau dengan menghubungi prototipe objek emp1menggunakan propertinya __proto__( delete emp1.__proto__.company).

β†’ Sumber

14. Ceritakan tentang pola desain prototipe.


Kesulitan: ****


Prototipe adalah pola desain generik. Ini digunakan untuk membuat objek. Objek yang dibuat menggunakan itu mengandung nilai yang disalin dari prototipe mereka (dari objek sampel). Templat ini juga disebut templat Properti.

Contoh penggunaan pola "prototipe" adalah inisialisasi objek tertentu dengan nilai standar yang disimpan dalam database. Nilai-nilai tersebut yang direkam dalam prototipe disalin ke objek baru tanpa mengakses database.

Perlu dicatat bahwa pola ini jarang digunakan dalam bahasa klasik. JavaScript menggunakan model pewarisan prototipe. Pola ini digunakan dalam desain objek baru dan prototipe mereka.

β†’ Sumber

15. Apa yang dimaksud dengan "zona mati sementara" di ES6?


Kesulitan: ****


ES6 melakukan pengangkatan variabel dan konstanta yang dideklarasikan menggunakan kata kunci letdan const(ini dilakukan dan kebangkitan entitas dideklarasikan dengan menggunakan kata kunci var, classdan function). Namun, kode memiliki zona yang memanjang dari memasuki lingkup hingga mendeklarasikan variabel atau konstanta. Saat mengakses variabel atau konstan di zona ini, kesalahan akan dihasilkan. Ini adalah "Zona Mati Temporal" (TDZ).

//console.log(aLet)  //  ReferenceError

let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

Dalam contoh ini, TDZ berakhir setelah deklarasi aLet, tetapi tidak setelah aLetnilai diberikan .

β†’ Sumber

16. Bisakah Anda menjelaskan perbedaan utama antara metode array forEach () dan map ()? Dalam situasi apa Anda memilih salah satu dari metode ini?


Kesulitan: ****


Untuk memahami perbedaan antara metode ini, mari kita bicara tentang fitur masing-masing.

Begini cara kerjanya .forEach():

  • Itu beralih ke elemen array.
  • Ia melakukan fungsi callback yang diteruskan untuk setiap elemen array.
  • Itu tidak mengembalikan apa pun.

const a = [1, 2, 3];
const doubled = a.forEach((num, index) => {
  //  -  num /  index.
});

// doubled = undefined

Berikut ini penjelasan singkat tentang metode ini .map():

  • Itu beralih ke elemen array.
  • Itu mengkonversi setiap elemen dari array asli menjadi elemen dari array baru, memanggil fungsi yang diteruskan untuk setiap elemen dari array asli.

const a = [1, 2, 3];
const doubled = a.map(num => {
  return num * 2;
});

// doubled = [2, 4, 6]

Sebagai hasilnya, ternyata perbedaan utama antara .forEach()dan .map()adalah bahwa ia .map()mengembalikan array baru. Jika Anda perlu mendapatkan hasil dari konversi elemen array asli tanpa mengubah array ini, maka Anda harus memilih .map(). Jika Anda hanya perlu mengulangi elemen-elemen array - maka Anda dapat menggunakannya .forEach().

β†’ Sumber

17. Apa perbedaan antara variabel yang tidak dideklarasikan, variabel yang berisi nilai nol, dan variabel yang tidak ditentukan? Bagaimana cara memeriksa variabel untuk fakta bahwa ia tidak dideklarasikan, juga null dan tidak terdefinisi?


Kesulitan: ****


Variabel yang tidak dideklarasikan dibuat ketika nilai diberikan ke pengenal yang sebelumnya tidak dinyatakan menggunakan var, letatau const. Variabel yang tidak dideklarasikan dideklarasikan dalam lingkup global, di luar lingkup saat ini. Dalam mode ketat, pengecualian dilemparkan ketika mencoba untuk menetapkan nilai ke variabel yang tidak dideklarasikan ReferenceError. Tidak disarankan menggunakan variabel yang tidak dideklarasikan - sama seperti menggunakan variabel global tidak disarankan. Mereka harus dihindari dengan segala cara. Untuk melindungi diri Anda dari konsekuensi menggunakan variabel yang tidak dideklarasikan, gunakan blokir try/catch.

function foo() {
  x = 1; //     ReferenceError
}

foo();
console.log(x); // 1

Variabel yang mengandung undefinedadalah variabel yang dideklarasikan yang tidak diberi nilai. Nilai undefinedmembentuk tipe datanya sendiri. Jika fungsi tidak mengembalikan apa pun, dan hasil dari panggilannya ditulis ke variabel, maka itu akan jatuh ke dalam variabel ini undefined. Untuk mengatur pemeriksaan undefined, Anda dapat menggunakan operator kesetaraan yang ketat ( ===) atau operator typeofyang mengembalikan string undefined. Harap perhatikan bahwa saat memeriksa, undefinedAnda tidak boleh menggunakan operator kesetaraan tidak-ketat ( ==), karena menganggap undefineddan nilai - nilainya sama null.

var foo;
console.log(foo); // undefined
console.log(foo === undefined); // true
console.log(typeof foo === 'undefined'); // true

console.log(foo == null); // true.        undefined!

function bar() {}
var baz = bar();
console.log(baz); // undefined

Variabel yang mengandung nilai nullharus secara eksplisit diatur ke nilai ini. Ini melambangkan tidak adanya makna dan berbeda dari undefined-variable di mana nilai di dalamnya secara eksplisit ditugaskan untuk itu. Untuk memeriksa nilainya null, cukup menggunakan operator kesetaraan yang ketat. Untuk memeriksa null, seperti dalam kasus pengecekan undefined, seseorang tidak boleh menggunakan operator kesetaraan yang tidak ketat, yang mempertimbangkan nilai nulldan setara undefined.

var foo = null;
console.log(foo === null); // true
console.log(typeof foo === 'object'); // true

console.log(foo == undefined); // true        null!

Saya mencoba untuk tidak pernah meninggalkan variabel dalam keadaan tidak dideklarasikan, atau dalam keadaan di mana mereka dinyatakan, tetapi mereka tidak secara eksplisit diberi nilai apa pun. Jika saya tidak akan menulis nilai ke variabel segera setelah deklarasi, saya menulisnya null. Jika Anda menggunakan linter, biasanya laporan kasus menggunakan variabel yang tidak dideklarasikan.

β†’ Sumber

18. Ceritakan tentang modul desain "Modul terbuka"


Kesulitan: *****


Template "Revealing Module" adalah variasi dari template "Module". Tujuan menggunakan pola ini adalah untuk mendukung enkapsulasi dan untuk menemukan beberapa properti dan metode yang dikembalikan dalam objek literal. Beginilah implementasi langsung template ini akan terlihat seperti:

var Exposer = (function() {
  var privateVariable = 10;

  var privateMethod = function() {
    console.log('Inside a private method!');
    privateVariable++;
  }

  var methodToExpose = function() {
    console.log('This is a method I want to expose!');
  }

  var otherMethodIWantToExpose = function() {
    privateMethod();
  }

  return {
      first: methodToExpose,
      second: otherMethodIWantToExpose
  };
})();

Exposer.first();        // : This is a method I want to expose!
Exposer.second();       // : Inside a private method!
Exposer.methodToExpose; // undefined

Kelemahan jelas dari templat ini adalah bahwa Anda tidak dapat menggunakan metode pribadi saat menggunakannya.

β†’ Sumber

19. Apa perbedaan antara objek Map dan WeakMap?


Kesulitan: *****


Objek-objek ini berperilaku berbeda jika variabel yang berisi referensi ke objek yang merupakan kunci dari salah satu pasangan kunci / nilai tidak tersedia. Berikut ini sebuah contoh:

var map = new Map();
var weakmap = new WeakMap();

(function() {
    var a = {
        x: 12
    };
    var b = {
        y: 12
    };

    map.set(a, 1);
    weakmap.set(b, 2);
})()

Setelah eksekusi IIFE selesai, kami tidak akan lagi memiliki akses ke objek adan b. Oleh karena itu, pengumpul sampah mengeluarkan kunci bdari weakmapdan membersihkan memori. Tetapi isinya maptetap sama.

Akibatnya, ternyata objek WeakMapmemungkinkan pengumpul sampah untuk menyingkirkan catatan yang tidak dirujuk dalam variabel eksternal. Objek mapmenyimpan pasangan nilai / kunci terlepas dari ada atau tidak adanya referensi kunci eksternal. Hal yang sama dapat dikatakan tentang implementasi struktur data Mapmenggunakan array biasa. The WeakMapβ€œlemah” referensi kunci yang digunakan. Mereka tidak mengganggu operasi pengumpul sampah jika tidak ada referensi lain ke objek yang digunakan sebagai kunci.

β†’ Sumber

20. Bagaimana parameter dilewatkan ke fungsi JavaScript: dengan referensi atau berdasarkan nilai?


Kesulitan: *****


Parameter selalu dilewati oleh nilai, tetapi referensi ke objek ditulis ke variabel yang mewakili objek. Oleh karena itu, ketika suatu objek ditransfer ke suatu fungsi dan properti dari objek ini diubah, perubahan ini disimpan dalam objek bahkan ketika fungsi keluar. Akibatnya, ada perasaan bahwa parameter dalam fungsi dilewatkan oleh referensi. Tetapi jika Anda mengubah nilai variabel yang mewakili objek, perubahan ini tidak akan memengaruhi objek yang berada di luar fungsi.

Berikut ini sebuah contoh:

function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

Inilah yang akan dihasilkan oleh kode ini:

10
changed
unchanged

β†’ Sumber

21. Bagaimana cara mengatur "pembekuan mendalam" suatu objek?


Kesulitan: *****


Untuk memberikan "pembekuan dalam" dari suatu objek menggunakan Object.freeze(), Anda perlu membuat fungsi rekursif yang "membekukan" properti objek, yang juga merupakan objek.

Berikut adalah contoh "pembekuan" biasa dari suatu objek:

let person = {
    name: "Leonardo",
    profession: {
        name: "developer"
    }
};
Object.freeze(person); //   
person.profession.name = "doctor";
console.log(person); // { name: 'Leonardo', profession: { name: 'doctor' } }

Inilah "deep freeze":

function deepFreeze(object) {
    let propNames = Object.getOwnPropertyNames(object);
    for (let name of propNames) {
        let value = object[name];
        object[name] = value && typeof value === "object" ?
            deepFreeze(value) : value;
    }
    return Object.freeze(object);
}
let person = {
    name: "Leonardo",
    profession: {
        name: "developer"
    }
};
deepFreeze(person);
person.profession.name = "doctor"; // TypeError: Cannot assign to read only property 'name' of object

Pesan kesalahan ditampilkan hanya dalam mode ketat. Dalam mode normal, nilai tidak berubah tanpa pesan kesalahan.

β†’ Sumber

22. Mengapa programmer JavaScript kesulitan menggunakan kata kunci ini?


Kesulitan: *****


Hal yang paling penting untuk dipahami thisadalah bahwa fungsi tidak memiliki nilai tetap this. Nilai ini tergantung pada bagaimana fungsi dipanggil. Jika kita mengatakan bahwa suatu fungsi dipanggil dengan beberapa nilai spesifik this, ini berarti bahwa nilai ini ditentukan bukan selama deklarasi fungsi, tetapi selama panggilannya. Berikut ini beberapa fitur this:

  • Jika fungsi ini dipanggil dalam bentuk biasa (yaitu, menggunakan view view someFunc()), itu thisakan merujuk ke objek global (di browser ini window). Jika kode dieksekusi dalam mode ketat, thisnilai akan ditulis ke undefined.
  • Jika fungsi ini disebut sebagai metode objek, maka kata kunci thisakan diwakili oleh objek yang dimiliki metode tersebut.
  • call apply, this , call apply.
  • , this .
  • , new, this , prototype -.
  • Jika fungsi itu dibuat menggunakan metode bind , maka kata kunci thisfungsi akan secara kaku terikat pada nilai yang diteruskan bindsebagai argumen pertama. Ini adalah satu-satunya pengecualian pada aturan yang fungsi tidak memiliki nilai hard-coded this. Fungsi yang dibuat menggunakan bindtidak dapat diubah this.

β†’ Sumber

23. Bandingkan penggunaan konstruk async / wait dan generator untuk mengimplementasikan fungsi yang sama


Kesulitan: *****


  • Saat iterasi generator menggunakan metode, .next()setiap panggilan ke metode ini mengembalikan nilai tunggal menggunakan kata kunci yield. Saat menggunakan async / menunggu konstruksi, menunggu ekspresi dieksekusi berurutan.
  • Desain async / await menyederhanakan penerapan case use generator tertentu.
  • Nilai yang dikembalikan oleh generator selalu memiliki formulir {value: X, done: Boolean}, dan fungsi asinkron mengembalikan janji yang diselesaikan dengan nilai X, atau gagal.
  • Fungsi asinkron dapat dikonversi ke generator menggunakan janji. Berikut ini adalah contoh konversi semacam itu.

Berikut adalah fungsi asinkron:

//  
async function init() {
    const res1 = await doTask1();
    console.log(res1);

    const res2 = await doTask2(res1);
    console.log(res2);

    const res3 = await doTask3(res2);
    console.log(res3);

    return res3;
}

init();

Ini generator yang serupa.

//    
function runner(genFn) {
    const itr = genFn();

    function run(arg) {
        let result = itr.next(arg);

        if (result.done) {
            return result.value;
        } else {
            return Promise.resolve(result.value).then(run);
        }
    }

    return run;
}

//   runner    
runner(function* () {
    const res1 = await doTask1();
    console.log(res1);

    const res2 = await doTask2(res1);
    console.log(res2);

    const res3 = await doTask3(res2);
    console.log(res3);

    return res3;
});

β†’ Sumber

Pembaca yang budiman! Apa pertanyaan JavaScript yang Anda tanyakan selama wawancara?


All Articles