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.

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;
a === b;
Berikut adalah beberapa panduan untuk menggunakan berbagai pemeriksa kesetaraan dalam JavaScript:- Jika salah satu nilai yang dibandingkan dapat berupa nilai
true
atau 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.
β Sumber2. 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
.β Sumber3. 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!" );
})();
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.β Sumber4. 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
function
dalam lingkup global dan untuk properti Object.prototype
. - Gunakan kata kunci
function
untuk 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
this
konteks 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
.
β Sumber5. 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 Student
yang merupakan subkelas dari kelas Person
dan 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;
}
}
β Sumber6. Ceritakan tentang metode Function.prototype.bind ().
Kesulitan: ***
Mengutip MDN: βMetode ini bind()
menciptakan fungsi baru yang, ketika dipanggil, menetapkan nilai yang this
disediakan 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 this
dalam 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);
β Sumber8. Apa perbedaan antara metode Object.freeze () dan kata kunci const?
Kesulitan: ***
Kata kunci const
dan metode Object.freeze()
adalah hal yang sangat berbeda.Kata kunci const
berlaku untuk binding (ke "variabel"). Ini menciptakan ikatan yang tidak dapat diubah, yaitu, tidak const
mungkin 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;
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";
console.log(person);
Harap dicatat bahwa pesan kesalahan ditampilkan dalam mode ketat. Dalam mode normal, operasi mengubah properti objek "beku" tidak berfungsi.β Sumber9. 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 yield
yang 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;
}
β Sumber10. 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.β Sumber11. 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 var
berbeda dari perilaku variabel dan konstanta yang dinyatakan menggunakan let
dan const
.β Sumber12. 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 delete
digunakan untuk menghapus properti objek. Dan x
- ini bukan properti objek - ini adalah variabel lokal. Operator delete
tidak mempengaruhi variabel lokal.β Sumber13. 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 company
bukan properti objek emp1
, tetapi properti prototipe. Operator delete
tidak menghapus properti prototipe objek. Objek emp1
tidak memiliki properti sendiri company
. Anda dapat memverifikasi ini dengan:console.log(emp1.hasOwnProperty('company'));
Jika kami masih perlu menghapus properti ini, Anda dapat melakukan ini dengan langsung menghubungi objek Employee
( delete Employee.company
), atau dengan menghubungi prototipe objek emp1
menggunakan propertinya __proto__
( delete emp1.__proto__.company
).β Sumber14. 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.β Sumber15. Apa yang dimaksud dengan "zona mati sementara" di ES6?
Kesulitan: ****
ES6 melakukan pengangkatan variabel dan konstanta yang dideklarasikan menggunakan kata kunci let
dan const
(ini dilakukan dan kebangkitan entitas dideklarasikan dengan menggunakan kata kunci var
, class
dan 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).
let aLet;
console.log(aLet);
aLet = 10;
console.log(aLet);
Dalam contoh ini, TDZ berakhir setelah deklarasi aLet
, tetapi tidak setelah aLet
nilai diberikan .β Sumber16. 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) => {
});
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;
});
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()
.β Sumber17. 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
, let
atau 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;
}
foo();
console.log(x);
Variabel yang mengandung undefined
adalah variabel yang dideklarasikan yang tidak diberi nilai. Nilai undefined
membentuk 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 typeof
yang mengembalikan string undefined
. Harap perhatikan bahwa saat memeriksa, undefined
Anda tidak boleh menggunakan operator kesetaraan tidak-ketat ( ==
), karena menganggap undefined
dan nilai - nilainya sama null
.var foo;
console.log(foo);
console.log(foo === undefined);
console.log(typeof foo === 'undefined');
console.log(foo == null);
function bar() {}
var baz = bar();
console.log(baz);
Variabel yang mengandung nilai null
harus 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 null
dan setara undefined
.var foo = null;
console.log(foo === null);
console.log(typeof foo === 'object');
console.log(foo == undefined);
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.β Sumber18. 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();
Exposer.second();
Exposer.methodToExpose;
Kelemahan jelas dari templat ini adalah bahwa Anda tidak dapat menggunakan metode pribadi saat menggunakannya.β Sumber19. 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 a
dan b
. Oleh karena itu, pengumpul sampah mengeluarkan kunci b
dari weakmap
dan membersihkan memori. Tetapi isinya map
tetap sama.Akibatnya, ternyata objek WeakMap
memungkinkan pengumpul sampah untuk menyingkirkan catatan yang tidak dirujuk dalam variabel eksternal. Objek map
menyimpan pasangan nilai / kunci terlepas dari ada atau tidak adanya referensi kunci eksternal. Hal yang sama dapat dikatakan tentang implementasi struktur data Map
menggunakan 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.β Sumber20. 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
β Sumber21. 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);
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";
Pesan kesalahan ditampilkan hanya dalam mode ketat. Dalam mode normal, nilai tidak berubah tanpa pesan kesalahan.β Sumber22. Mengapa programmer JavaScript kesulitan menggunakan kata kunci ini?
Kesulitan: *****
Hal yang paling penting untuk dipahami this
adalah 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 this
akan merujuk ke objek global (di browser ini window
). Jika kode dieksekusi dalam mode ketat, this
nilai akan ditulis ke undefined
. - Jika fungsi ini disebut sebagai metode objek, maka kata kunci
this
akan 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
this
fungsi akan secara kaku terikat pada nilai yang diteruskan bind
sebagai argumen pertama. Ini adalah satu-satunya pengecualian pada aturan yang fungsi tidak memiliki nilai hard-coded this
. Fungsi yang dibuat menggunakan bind
tidak dapat diubah this
.
β Sumber23. 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(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;
});
β SumberPembaca yang budiman! Apa pertanyaan JavaScript yang Anda tanyakan selama wawancara?