Pertanyaan wawancara javascript yang sering diajukan. Lima Pertanyaan Wawancara Kerja JavaScript Umum

Selama wawancara, orang sering kali menanyakan jenis pertanyaan yang sama, yang jawabannya sudah lama dipelajari.

Hari ini kita akan membahas isu-isu yang jarang disebutkan.

Jadi, mari kita mulai!

1. Apa yang dimaksud dengan foo.x? var foo = (n: 1);
var bar = foo;
foo.x = foo = (n: 2);

Pertanyaan ini ditanyakan oleh 3% perusahaan teratas (Apple, Google, Facebook).

Hal utama yang perlu diperhatikan di sini adalah foo yang direferensikan oleh foo.x adalah "disetel" sebelum foo berubah. foo.x mengacu pada nilai lama foo.

  • Ayo lref menjadi hasil evaluasi Ekspresi Sisi Tangan Kiri.
  • Ayo rref menjadi hasil evaluasi Ekspresi Penugasan.

Artinya di foo lama akan muncul properti baru x sama dengan (n:2). Dan foo baru akan ditulis (n: 2) .

Nilai foo lama ada di bar:

// batang
{
n: 1,
X: (
n: 2
}
}

Karena dalam keluaran selanjutnya dari foo.x foo kita mengacu pada nilai barunya, di mana x tidak ada, maka foo.x tidak akan terdefinisi.

Jawaban: tidak terdefinisi

2. Tuliskan fungsi penjumlahan dalam bentuk add(num1)(num2)..

Catatan: Jumlah istilah tidak dibatasi

Dalam bahasa aslinya, masalah ini diselesaikan dengan cara ini:

Konstan tambah = (a) => (
misalkan jumlah = a;
fungsi konstan = (b) => (
jika (b) (
jumlah += b;
fungsi pengembalian;
) kalau tidak (
jumlah pengembalian;
}
};
fungsi pengembalian;
);

tambahkan(2)(3)(); // 5;

Tapi kemudian mereka memberi Anda satu syarat.

Hapus tanda kurung tambahan di akhir add(2)(3) // 5 add(1)(2)(5) // 8 ... Sekarang tugasnya menjadi lebih sulit. Dan solusinya terletak pada mengesampingkan metode tersebut

Konstan tambah = (a) => (
misalkan jumlah = a;
fungsi konstan = (b) => (
jumlah += b;
fungsi pengembalian;
};
nilaiDari.
func.valueOf = () => jumlah;

fungsi pengembalian; ); konsol.log(tambahkan(2)(3)); // 5; Saat kita menelepon konsol.log dia berharap untuk melihatnya.

Rangkaian, jika tidak ada, maka akan dicoba dibuat dari nilai yang diterima Rangkaian

Dalam contoh di atas, setelah mengeksekusi add(2)(3), sebuah fungsi dikembalikan, yang console.log akan berubah menjadi sebuah String, selama tindakan ini metode valueOf akan dipanggil untuk mengubah fungsi menjadi primitif, dan jadi kita telah ditimpa

metode ini , maka ia akan mengembalikan nilai penjumlahan kita, bukan nilai standar. Catatan:
Contoh ini tidak berlaku untuk semua orang.
menghibur.

3. Apa yang akan ditampilkan di konsol? Jelaskan alasannya. var a=(),
b=(kunci:"b"),

c=(kunci:"c");

a[b]=123; a[c]=456; makna. Pada kode di atas, b dan c adalah objek, oleh karena itu keduanya diubah menjadi "" (String). Karena a[c]=456; nilainya sama, ternyata kita memberikan nilai baru pada properti yang sama.

Ini setara dengan menulis:

Var a=(),
b=”objek”,
c="objek";

3. Apa yang akan ditampilkan di konsol? Jelaskan alasannya. var a=(),
a[c]=456;

4. Menulis fungsi sederhana untuk mengetahui apakah salah satu parameter input sama dengan 3.

Di sini penekanannya adalah pada pengujian pengetahuan tentang argumen, tetapi kadang-kadang mereka melangkah lebih jauh dan meminta untuk menceritakan cara kerjanya Array.prototype.slice.call(argumen).

Fungsi isThreePass())(
const args = Array.prototype.slice.call(argumen);
return args.indexOf(3) != -1;
) isThreePass(1,2) //salah
isThreePass(9,3,4,9) //benar

Seperti yang kita ketahui argumen bukan array, tapi objek biasa, jadi tidak ada itu metode yang berguna Bagaimana indeksDari. Untuk tujuan ini digunakan Array.prototype.slice.call(argumen), yang terbuat dari argumen - > susunan.

Tapi tetap saja, bagaimana cara kerjanya?

.panggilan() Dan. menerapkan() memungkinkan Anda menyetel secara eksplisit ini dalam fungsi. Dan jika Anda lulus argumen seperti ini, Itu mengiris akan bekerja dengannya seperti array biasa.

Inilah eksperimen yang menarik:

Konstan o = (
"0": "nol",
"1": "satu"
);
"0": "nol",
.slice.call(o); // ;
konstan oo = (
"1": "satu",

panjang: 2

); .slice.call(oo); //["nol", "satu"]; 5. Gabungkan dua array bertumpuk ], ] -> Masalahnya bisa diselesaikan .

dalam berbagai cara

. Biasanya mereka ingin mengetahui apakah orang yang diwawancara mengetahui metode seperti itu mengurangi .

Idenya adalah untuk melakukan iterasi melalui semua elemen array asli dan “sub-array”-nya untuk mengembalikan nilai yang ditemukan ke array baru. Ini terjadi secara rekursif hingga kita mencapai elemen terakhir.

Ini juga membantu kita dalam pembentukan susunan baru

pertemuan

Const flatten = (arr) => arr.reduce((flat, toFlatten) => flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten), );

Itu saja! 🙏🏼 👍

Mereka dengan sukarela mengundang saya untuk wawancara, saya tidak tahu apakah itu karena foto lucu di resume saya atau isinya. Berbicara tentang resume, saya menghabiskan dua atau tiga jam untuk menjelaskan teknologi yang digunakan dalam setiap pekerjaan saat ini. Terkadang saya melihat-lihat halaman orang lain, bagaimana halaman tersebut dirancang, dan tiba-tiba saya menemukan sesuatu yang berguna untuk diri saya sendiri... Tugas: Pertama, sesuatu yang lebih mudah.


1. Ada beberapa string (var str = "fgfggg";), apa jadinya jika kita mengambil str?

Itu saja! 🙏🏼 👍

Karena kita bekerja dengan angka, kita perlu memperluas prototipe Angka dengan metode baru.

Number.prototype.plus = function (nilai) ( ​​kembalikan ini + nilai; ) Number.prototype.minus = fungsi (nilai) ( ​​kembalikan ini - nilai; )
Nomor dua akan dapat diakses melalui ini ditambah fungsi. Dari situ kita mengembalikan hasil penjumlahan angka yang ditunjuk oleh ini dan angka yang dilewatkan sebagai argumen. Begitu juga untuk minusnya.


3. Saat ini jarang terjadi, namun orang masih bertanya: “Mengapa menulis langsung ke prototipe tipe dasar itu buruk?”

Itu saja! 🙏🏼 👍

Array.prototipe.sort = fungsi () () var t = ; t.sort()
Hasil yang diharapkan adalah , tetapi tidak terdefinisi akan dikembalikan.
Kami mengharapkan itu metode standar akan bekerja sesuai dengan dokumentasi, tetapi beberapa pengembang mungkin mengganti metode ini, dan itu akan memberikan hasil yang sama sekali tidak terduga.
Inilah sebabnya mengapa perpustakaan prototype.js lebih rendah daripada jQuery.


4. Diberikan suatu fungsi, dibutuhkan string “*”, “1”, “b”, “1c” sebagai argumen, implementasikan sehingga mengembalikan string “1*b*1c”

Itu saja! 🙏🏼 👍

Ini bisa diselesaikan secara langsung, melalui semua argumen dalam satu lingkaran, tapi kami akan melakukan sesuatu yang lebih cerdas.

Fungsi getStr() ( return .slice.call(argumen, 1).join(argumen) )


5. Diberikan sebuah pohon, Anda perlu mencari jumlah semua simpul.

Itu saja! 🙏🏼 👍

Saya memecahkan masalah menggunakan rekursi, lalu kami menyederhanakan solusinya, dan kemudian menulis ulang ke antrian.

Rekursi.

Jumlah var = 0; fungsi getSum(obj) ( jumlah += obj.valueNode; if (obj.next != null) ( untuk (var i = 0; i< obj.next.length; i++) { getSum(obj.next[i]); } } return sum; } var tree1 = { valueNode: 1, next: [ { valueNode: 3, next: null }, { valueNode: 2, next: null } ] } var tree = { valueNode: 3, next: [{ valueNode: 1, next: null }, { valueNode: 3, next: null }, { valueNode: 2, next: null }, { valueNode: 2, next: [ { valueNode: 1, next: null }, { valueNode: 5, next: null } ] }] }; console.log(getSum(tree1)); sum = 0; console.log(getSum(tree));
Antre.

Fungsi getSum(obj) ( var arr = , sum = 0, current; while(arr.length > 0) ( current = arr.shift(); sum += current.valueNode; if (current.next != null) ( untuk (var saya = 0; saya< current.next.length; i++) { arr.push(current.next[i]); } } } return sum; } var tree = { valueNode: 3, next: [{ valueNode: 1, next: null }, { valueNode: 3, next: null }, { valueNode: 2, next: null }, { valueNode: 2, next: [ { valueNode: 1, next: null }, { valueNode: 5, next: null } ] }] }; getSum(tree)


6. Apakah mungkin untuk mengubah nilai sebelum dan sesudah dari js?

Itu saja! 🙏🏼 👍

Tidak, yang bisa kita lakukan hanyalah menghapus kelas yang ada sebelum atau sesudah ditentukan, atau sebaliknya menambahkannya.


Mari kita lakukan sesuatu untuk meringankan otak, pertanyaan untuk tata letak.

7. Tempatkan tiga blok berukuran 20X20px berturut-turut, dalam blok lebar 60px, dan blok tersebut harus memiliki batas.

8. Bagaimana sudut membulat diterapkan pada elemen dan gaya teks (font, jenis font, warna, dll.)?

Itu saja! 🙏🏼 👍

Properti gaya akan diterapkan ke semua elemen dengan teks kecuali tag memiliki aturan gaya yang ditentukan. Misalnya, tautan memiliki warna teks default dan memiliki prioritas lebih tinggi daripada yang kami tentukan di isi. Faktanya adalah bahwa untuk banyak properti, nilai defaultnya adalah warisan, yaitu seperti induknya. Ternyata naik hingga mencapai tubuh.
Sebaliknya, untuk properti border-radius, ini hanya diterapkan pada tag yang sudutnya ingin kita bulatkan.


9. Apa yang dimaksud dengan pengaturan ulang gaya?

Itu saja! 🙏🏼 👍

Banyak tag yang memiliki gaya yang ditentukan secara default; selama proses tata letak, kita harus mendefinisikannya ulang. Agar tidak melakukan ini setiap saat, kami “membuang” mereka “secara besar-besaran”. Untuk melakukan ini, buat file untuk gaya, sambungkan terlebih dahulu atau yang pertama file gaya, di bagian paling atas kami menunjukkan gaya kami untuk tag dasar.
Misalnya. Kita sering menggunakan ul list untuk tata letak menu, untuk ini kita harus mereset padding, margin dan tipe gaya daftar setiap saat. Anda dapat mengatur gaya sekali, dan daftarnya akan menjadi tanpa eksternal dan perbatasan dalam, dan juga tanpa spidol.


10. Kita perlu meletakkan popup di tengah; kita tahu dimensinya, tapi kita tidak ingin popup itu bergulir bersama halaman, dan tingginya mungkin tidak sesuai dengan tinggi layar.

Itu saja! 🙏🏼 👍

body ( overflow: tersembunyi; ) .wrap ( posisi: tetap; atas: 0; kiri: 0; lebar: 100%; tinggi: 100%; overflow-y: auto; warna latar: rgba(230, 230, 230, .1); .popup ( posisi: absolut; lebar: 400 piksel; tinggi: 300 piksel; kanan: 0; kiri: 0; atas: 0; bawah: 0; margin: otomatis; )


11. Gambarlah setengah lingkaran menggunakan gaya.

Itu saja! 🙏🏼 👍

lebar: 100 piksel; tinggi: 100 piksel; perbatasan-kanan: 1px solid #f00; radius batas: 0 50% 50% 0;


12. Terdapat array yang berisi objek dengan tanggal, diurutkan berdasarkan tanggal.

Itu saja! 🙏🏼 👍

var arr = [(tanggal: "10/01/2017"), (tanggal: "05/11/2016"), (tanggal: "21/13/2002")]; arr.forEach(fungsi(item) ( var arrDate = item.tanggal.split("."), tanggal = Tanggal baru(Nomor(arrDate), Nomor(arrDate), Nomor(arrDate)); item.waktu = tanggal. getTime()); arr.sort(fungsi (a, b) ( jika (a.waktu - b.waktu< 0) { return false; } else { return true; } }); var res = arr.map(function (item) { return {date: item.date}; }); console.log(res);


13. Ada beberapa kata, tentukan apakah terdiri dari huruf yang sama (“cat”, “tok”, “okt”)

Itu saja! 🙏🏼 👍

var arr = ["kot", "tok", "okt"], arr1 = ["kot", "tok", "ott"]; fungsi sameWords(arr) ( var kata1, kata2; untuk (var i = 0; i< arr.length-1; i++) { word1 = 0; word2 = 0; if (arr[i].length !== arr.length) { return false; } else { for (var j = 0; j < arr[i].length; j++) { word1 += arr[i][j].charCodeAt(0); word2 += arr[j].charCodeAt(0); } if (word1 !== word2) { return false; } } } return true; } console.log(sameWords(arr)); console.log(sameWords(arr1));

Tentang janjiB akhir-akhir ini Mereka sering mulai bertanya tentang promse, apa itu, metode penanganan kesalahan apa yang tersedia, dan apakah mungkin dilakukan tanpa promse (14, 15, 16).

Itu saja! 🙏🏼 👍

Saya akan mulai dari jauh, karena js tidak sinkron, maka sebagai hasil pelacakan penyelesaian, fungsi panggilan balik tertentu diteruskan sebagai argumen, yang dipanggil ketika sudah siap. Rantai metode asynchronous berkembang, yang menyebabkan Callback Hell, yang mempersulit pengerjaan kode, men-debug kesalahan, dan digantikan oleh janji.

Var janji = janji baru(fungsi (putuskan, tolak) ( ... setTimeout(fungsi () ( tekad(res); ), 5000); ));
Beberapa janji dapat digabungkan dan tanggapan darinya dapat diterima sekaligus
var janjiGambar = ; untuk (misalkan i = 0; i< count; i++) { promisesImages.push(new Promise((resolveImg, rejectImg) =>( biarkan img = Gambar baru(), startTime = Tanggal.sekarang(); img.src = ini.imgUrl + "?" + Math.floor(Math.random() * 100000000); img.onload = () => (resolveImg(Date.now() - startTime); ); img.onerror = rejectImg ))); ) Promise.all(promisesImages).then((timings) => (...))


17. Dan tentu saja, pertanyaan terakhir: “Bagaimana Anda bisa hidup tanpa janji?”

Itu saja! 🙏🏼 👍

Dengan cara lama, variabel penghitung diperkenalkan dan segera setelah tindakan asinkron berikutnya berakhir, variabel tersebut dibandingkan dengan kuantitas total.


18. Saya juga teringat pertanyaan tentang penanganan kesalahan dalam janji. Kami memiliki tiga permintaan ke server, satu mengembalikan nama pengguna, yang kedua datanya, dan yang ketiga gambar untuk avatar, kami menggunakan janji untuk setiap permintaan, menggabungkannya ke dalam rantai, apa yang akan terjadi jika terjadi kesalahan di salah satu permintaan, apakah rantainya akan selesai?

Itu saja! 🙏🏼 👍


Janji terus bertambah dan Callback Hell digantikan oleh Promise Hell. Apa yang harus dilakukan?

Itu saja! 🙏🏼 👍

fungsi tes() ( kembalikan Janji baru(fungsi (putuskan) ( setTimeout (fungsi () ( tekad(1); )) )) fungsi async test1() ( var res = menunggu tes(); console.log(res + 1 );
Faktanya, eksekusi test1 sepertinya “berhenti” sampai kita menerima respon dari test. Saya pernah membaca tentang cara-cara ini sebelumnya, tetapi saya tidak terlalu memperhatikannya, tetapi entah bagaimana dalam percakapan mereka muncul, saya terkejut: “Bagaimana eksekusinya berhenti, tidak jelas fungsinya apa, di mana itu ditentukan, ketika panggilan balik - semuanya jelas di sini, Anda dapat melihat apa yang akan terjadi dalam fungsi setelah operasi selesai, atau kami selalu dapat mencari berdasarkan nama, sekali lagi, seperti biasa tentang konteksnya.” Mereka menjawab bahwa saya memiliki otak JavaScript dan saya sangat terbiasa dengan asinkron sehingga eksekusi sinkron menurut saya sesuatu yang melampaui batas, tetapi dalam kepulan di mana saya pernah memprogram semuanya secara sinkron, bahkan jika membaca dari file, tidak akan lanjutkan sampai selesai.


(19) Berikut adalah contoh lain dari asinkroni. Jelaskan dalam urutan apa angka-angka tersebut akan ditampilkan dan mengapa demikian.
konsol.log(1); setTimeout(fungsi() ( console.log(2); ), 0) console.log(3);
Cukup populer, harus saya katakan. Jadi saya mendapatkannya sekali lagi. Sudah berhasil, saya mulai menjawab: "1, 3, 2. Karena meskipun js tidak sinkron, ada antrian eksekusi di dalamnya dan setTimeout dan setInterval, jika mereka menentukan 0, tempatkan pemanggilan fungsi di akhir antrian."
Di sini harus dikatakan bahwa orang-orang gagal, mengatakan bahwa saya menjawab dengan benar, sekitar 132, tetapi tidak menjelaskan alasannya.

(20) Secara umum, pertanyaan tentang setTimeout dan setInterval sangat relevan. Saya ditanya: “Berapa waktu minimum yang dapat disetel?”

Itu saja! 🙏🏼 👍

Setiap browser memiliki batas minimumnya sendiri; jika Anda menentukan kurang dari itu, penundaannya akan tetap tidak kurang dari batas minimum. Kadang-kadang bahkan lebih lama dari waktu yang ditentukan, karena tugas masuk ke dalam antrian dan waktu tersebut adalah jumlah dari waktu yang ditentukan ditambah biaya pelaksanaan tugas-tugas dalam antrian di depannya.

Di mana kita akan berada tanpa penutupan Belum lama ini, kami mendedikasikan seluruh artikel untuk contoh ini(), yang dijelaskan pembaca di komentar segala macam cara solusi, dari yang tradisional hingga yang fantastis. Inilah yang biasanya saya bicarakan saat wawancara.
untuk (var saya = 0; saya< 10; i++) { setTimeout(function () { console.log(i); }, 100); }
21. Apa yang akan dihasilkan ke konsol, bagaimana Anda dapat memodifikasi contoh sehingga memberikan hasil yang benar (sebutkan sebanyak mungkin cara)?

Itu saja! 🙏🏼 👍

Yang paling umum, bungkus dengan penutup

Untuk (var i = 0; i< 10; i++) { (function (i) { setTimeout(function () { console.log(i); }, 100); })(i) }
Tidak semua orang memperhatikan fakta bahwa dalam i Anda tidak hanya dapat menyampaikan konteks

Untuk (var i = 0; i< 10; i++) { setTimeout(function (i) { console.log(i); }.bind(this, i), 100); }
Anda juga dapat meneruskan argumen ke metode setInterval dan setTimeout, yang akan diteruskan sebagai argumen ke fungsi panggilan balik
untuk (var saya = 0; saya< 10; i++) { setTimeout(function (i) { console.log(i); }, 100, i); }
es6

Untuk (misalkan i = 0; i< 10; i++) { setTimeout(function () { console.log(i); }, 100); }
Salah satu fitur es6, in dalam hal ini akan bekerja agak tidak terduga, biarlah tidak ada di blok ().


Mari kita lakukan sesuatu yang lebih keras.

22. Anda perlu menulis fungsi yang akan mengembalikan "halo dunia", tetapi di badan fungsi Anda tidak dapat menggunakan angka atau huruf, dan loop, array, objek dapat digunakan, tetapi tanpa angka.

Itu saja! 🙏🏼 👍

Sayangnya, orang-orang menarik ini tidak memberi tahu saya cara mengatasinya, jadi setelah berpikir di rumah, saya hanya bisa menebak.

Var nol = .panjang, satu = [()].panjang, dua = [,].panjang, tujuh = [,].panjang; console.log(String.fromCharCode(Number(String(tujuh) + String(dua))));
Jadi saya dapat huruf H, tapi ini masih mesum, saya hanya perlu membuat 10 karakter sisanya...


(23) Dari mereka. Angka-angka dari 1 hingga 100 ada dalam sebuah array, tercampur secara kacau, satu angka telah dihapus dari sana, kita perlu mencari angka apa itu. algoritma tidak boleh melebihi kompleksitas O(n^2).

Itu saja! 🙏🏼 👍

Telusuri array dalam satu lingkaran dan tambahkan semua angka di sana dan kurangi dari angka yang diperoleh dengan rumus (n + 1) / (n / 2).

Solusi yang lebih eksotis muncul di benak saya. Anak-anak dan orang yang lemah hati sebaiknya tidak menonton.

Var jumlah = 101*50, sumArr = eval(.join("+").replace("++", "+")), res; res = jumlah-jumlahArr;


Saya baru ingat mereka pernah bertanya: “Apa cara tercepat untuk menemukan jumlah elemen array?”

Itu saja! 🙏🏼 👍

eval(.bergabung("+")


Pada saat itu saya ingat dan tidak ada yang lebih baik yang terjadi.

(24) Inilah tugas lain yang gagal. Saya akan mengutipnya kata demi kata, dan saya akan menuliskannya sebagaimana mereka menulisnya kepada saya.

Buku Fungsi(nama, penulis) ( this.name = nama; this.author = penulis; kembalikan ini; ) function Foo(Buku, "Tutorial Javascript", "Petr Sergeev")
Menerapkan Foo

Itu saja! 🙏🏼 👍

Saya bingung dengan fungsi baris ini Foo(Buku, "Tutorial Javascript", "Peter Sergeev"). Apakah saya satu-satunya yang melihat ada yang salah di sini? Saya ditawari untuk menyelesaikannya melalui Object.create(), tapi saya tidak setuju. Properti dan metode yang ditulis ke dalam fungsi konstruktor itu sendiri tidak akan "disalin" oleh Object.create.

Buku Fungsi(nama, penulis) ( this.name = nama; this.author = penulis; kembalikan ini; ) function Foo(Cclass, nama, penulis) ( return Object.create(Cclass.prototype); ) var book = Foo( Buku, "js", "petr"); console.log(buku.nama); -> tidak terdefinisi
Tentu saja, mereka tidak menerima saya, tetapi terakhir mereka menyarankan saya untuk mempelajari teori dengan lebih baik. Merengek-merengek.
Bagaimanapun, saya lebih memilih untuk memutuskan dengan cara ini.

Buku Fungsi(nama, penulis) ( this.name = nama; this.author = penulis; kembalikan ini; ) function Foo(Cclass, nama, penulis) ( return Cclass.call((), nama, penulis); ) var buku = Foo(Buku, "js", "petr"); console.log(buku.nama);
Saya ingin menyarankan orang-orang untuk lebih mempersiapkan wawancara.

Soal palindrom (25) Ya, mereka masih menanyakan soal ini. Dan dia bertemu saya beberapa kali. Pertama kali saya mulai menyelesaikannya dalam satu lingkaran, sepertinya berhasil, tetapi masih ada masalah simbol yang berbeda, menulis ganti untuk setiap karakter bukanlah suatu pilihan, dan saya tidak kuat dalam ekspresi reguler, dan ini akan berfungsi hingga kemunculan pertama yang sesuai. Saya tidak terbiasa meninggalkan sesuatu yang tidak dapat dipahami, jadi saya menemukan cara untuk mengimplementasikan fungsi tersebut.

Fungsi isPalindrom1(str) ( if (str.toLowerCase().replace(/[^а-яА-ЯеЁ]/g, "") === str.toLowerCase().replace(/[^а-яА-ЯеЁ ]/g, "").split("").reverse().join("")) ( kembalikan benar; ) lain ( kembalikan salah; ) )
Cantik, sederhana, elegan.

Ini lucu, tapi sekitar setahun kemudian saya menemukan pertanyaan yang sama. Saya senang: “Beruntung.” Ternyata, tidak. Itu harus diselesaikan menggunakan loop, dan ekspresi reguler hanya dapat digunakan untuk satu karakter. Teman bicaranya memotivasi hal ini dengan fakta bahwa mengganti dengan ekspresi reguler di seluruh baris terlalu menghabiskan banyak sumber daya.

Setelah berpikir di rumah, saya menemukan ini:
fungsi isPalindrom(str) ( var str = str.toLowerCase(), lim = str.length - 1, i = 0, j = str.length - 1; while (i 5, saat memanggil f(2)(3), juga akan kembali 5

Itu saja! 🙏🏼 👍

fungsi f(a, b) ( if (b !== tidak terdefinisi) ( return a + b; ) else ( return function (b) ( return a + b; ) ) )
Setidaknya templat ini disebutkan dalam buku Stefanov, dalam praktiknya saya belum pernah melihat orang menggunakannya.


Lagi pilihan yang sulit.
f(1)(2)(3)() -> 6, f(0)(3)(1)(5)() -> 8

Itu saja! 🙏🏼 👍

fungsi f(arg) ( nilai var = arg; mengembalikan fungsi (arg) ( if (arg !== tidak terdefinisi) ( return f(value + arg); ) else ( mengembalikan nilai; ) ) )


Menerapkan fungsi yang mengembalikan hasil

Foo(1)(2)(3) -> 6
foo(1)(2)(3)(4) -> 10
foo(-1)(2)(3)(4)(7) -> 15
foo(1)(2)(3)...(n) akan mengembalikan hasil 1+2+3...+n

Opsi tersulit adalah ketika panggilan ke konstruksi ini tidak diakhiri dengan tanda kurung kosong, yang berarti kita tidak memiliki penunjuk eksplisit ke output. Tugas itu tidak menjadi tanggung jawab saya; di komentar artikel, mereka dengan baik hati memberi tahu saya solusinya.

Pada akhirnya itu berhasil

fungsi foo(nilai) ( ​​var acc = nilai; fungsi addNext(next) ( acc += berikutnya; return addNext; ) addNext.toString = addNext.valueOf = function() ( return acc; ) return addNext; )


29. Saat wawancara untuk pekerjaan sebelumnya, saya menemukan pertanyaan: “Apa itu hidup/mati?”

Itu saja! 🙏🏼 👍

Di suatu tempat dari kedalaman kesadaran muncul bahwa ini adalah analog dari on/off, dengan bantuan mereka Anda dapat melampirkan/menghapus penangan ke acara mereka. Tetapi metode yang lebih tua, dibandingkan dengan on/off.
Dalam proyek ini saya juga menemukan bind/unbind

30. JSONP, cara penerapannya

Itu saja! 🙏🏼 👍

Kami tidak ingin berada di satu situs, menerima data dari situs lain, dan memprosesnya. Apa yang harus dilakukan? Mungkin ajax, tetapi memiliki batasan kebijakan keamanan. Protokol, domain, dan port harus sama; kami bahkan tidak dapat mengirim permintaan Ajax ke subdomain.
Namun demikian, pengembang menemukan peretasan tertentu untuk kueri lintas domain.
Jika Anda menggunakan jquery, yang perlu Anda lakukan hanyalah menentukan “jsonp” di parameter “dataType”.
Hanya sedikit orang yang tahu apa inti dari hal ini dari permintaan ini, implementasi di native js kurang lebih seperti ini

Var url = "http://mydomen.com/news.php", script = document.createElement("script"), callbackName = "jsonCallback" + Math.randome();
script.src = url + "?panggilan balik" + nama panggilan balik; window = function(response)( console.log(response); ) document.header.appendChild(script); tag skrip mulai mengunduh skrip yang terletak di alamat di atribut src, dan setelah mengunduh, eksekusi terjadi. Jadi kami membuat tag skrip.
Secara acak

menghasilkan nama fungsi. Kami membentuk URL ke sumber daya, tempat nama fungsi baru kami diteruskan sebagai parameter.
Di area global, menggunakan kunci callbackName, sebuah fungsi ditempatkan yang akan dipanggil ketika data diterima dari sumber daya, fungsi tersebut akan tersedia secara internal melalui parameter;
Sesuatu seperti ini akan berfungsi di server sumber daya
window.jsonCallback0.90428777 -> fungsi (respons) ( console.log(response); )
Karena tag dengan atribut src hanya dapat mengirim DAPATKAN permintaan maka jsonp tidak mendukung POST


31. Header CORS?

Itu saja! 🙏🏼 👍

Ini adalah alternatif untuk jsonp; header khusus mencantumkan sumber daya "tepercaya" yang dapat menerima data darinya, dan jika Anda menentukan "*", maka situs mana pun yang diakses akan menerima data.
Sama seperti jsonp, hanya permintaan GET yang tersedia.

Ketika saya berbicara tentang alternatif jsonp, pewawancara menolak opsi ini, dengan mengatakan bahwa itu tidak dapat diandalkan. Saya tidak setuju dengannya. JSONP lebih mudah dipalsukan daripada header CORS

  • Sergei Savenkov

    semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat