12 Trik JavaScript Yang Kebanyakan Tutorial Terlepas
Apabila saya mula belajar JavaScript, perkara pertama yang saya lakukan ialah membuat senarai helah yang membantu saya menjimatkan masa. Saya melihatnya daripada pengaturcara lain, di tapak yang berbeza dan dalam manual.
Dalam artikel ini, saya akan menunjukkan kepada anda 12 cara terbaik untuk menambah baik dan mempercepatkan kod JavaScript anda. Dalam kebanyakan kes ia adalah universal.
Kami mengingatkan:untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".
Jenis objek Set telah diperkenalkan dalam ES6, bersama-sama dengan..., operator spread, kita boleh menggunakannya untuk mencipta tatasusunan baharu yang mengandungi hanya nilai unik.
Dalam keadaan biasa, lebih banyak kod diperlukan untuk melaksanakan operasi yang sama.
Teknik ini berfungsi untuk tatasusunan yang mengandungi jenis primitif: tidak ditentukan, null, boolean, rentetan dan nombor. Jika anda bekerja dengan tatasusunan yang mengandungi objek, fungsi atau tatasusunan tambahan, anda memerlukan pendekatan yang berbeza.
Panjang tatasusunan cache dalam kitaran
KITARAN
Apabila anda belajar untuk gelung, anda mengikut prosedur standard:
for (let i = 0; i < array.length; i++){
console.log(i);
}
Walau bagaimanapun, dengan sintaks ini, gelung for berulang kali menyemak panjang tatasusunan setiap lelaran.
Kadangkala ini boleh berguna, tetapi dalam kebanyakan kes, cache panjang tatasusunan adalah lebih cekap, yang memerlukan satu akses kepadanya. Kita boleh melakukan ini dengan menentukan pembolehubah panjang di mana kita menentukan pembolehubah i, seperti ini:
for (let i = 0, length = array.length; i < length; i++){
console.log(i);
}
Pada dasarnya, hampir sama seperti di atas, tetapi dengan meningkatkan saiz gelung kita akan mendapat penjimatan masa yang ketara.
Penarafan litar pintas (Penilaian McCarthy)
OPERATOR BERSYARAT
Operator ternary ialah cara yang pantas dan cekap untuk menulis pernyataan bersyarat yang mudah (dan kadangkala tidak begitu mudah):
x> 100? βlebih daripada 100β: βkurang daripada 100β;
x> 100? (x>200? "lebih daripada 200": "antara 100-200"): "kurang daripada 100";
Tetapi kadangkala walaupun pengendali ternary lebih rumit daripada yang diperlukan. Kita boleh menggunakan 'dan' && dan 'atau' sebaliknya || Pengendali Boolean untuk menilai ungkapan tertentu dengan cara yang lebih ringkas. Ia sering dipanggil "litar pintas" atau "kadaran litar pintas".
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Katakan kita mahu memulangkan hanya satu daripada dua atau lebih syarat.
Menggunakan && akan mengembalikan nilai palsu pertama. Jika setiap operan dinilai kepada benar, maka ungkapan terakhir yang dinilai akan dikembalikan.
let one = 1, two = 2, three = 3;
console.log(one && two && three); // Result: 3
console.log(0 && null); // Result: 0
Menggunakan || akan mengembalikan nilai sebenar pertama. Jika setiap operan bernilai palsu, maka nilai penilaian terakhir akan dikembalikan.
let one = 1, two = 2, three = 3;
console.log(one || two || three); // Result: 1
console.log(0 || null); // Result: null
1 Contoh
Katakan kita mahu mengembalikan panjang pembolehubah, tetapi kita tidak tahu jenisnya.
Dalam kes ini, anda boleh menggunakan if/else untuk menyemak bahawa foo adalah jenis yang betul, tetapi kaedah ini mungkin terlalu panjang. Oleh itu, adalah lebih baik untuk mengambil "litar pintas" kami.
return (foo || []).length;
Jika pembolehubah foo mempunyai panjang yang sesuai, maka itu akan dikembalikan. Jika tidak, kita akan mendapat 0.
2 Contoh
Adakah anda mengalami masalah mengakses objek bersarang? Anda mungkin tidak tahu sama ada objek atau salah satu subsifatnya wujud, dan ini boleh membawa kepada masalah.
Sebagai contoh, kami ingin mengakses sifat data dalam this.state, tetapi data tidak ditakrifkan sehingga program kami mengembalikan permintaan pengambilan.
Bergantung pada tempat kami menggunakannya, memanggil this.state.data mungkin menghalang aplikasi daripada bermula. Untuk menyelesaikan masalah, kita boleh membungkus ini dalam ungkapan bersyarat:
Pilihan yang lebih baik ialah menggunakan operator "atau".
return (this.state.data || 'Fetching Data');
Kami tidak boleh menukar kod di atas untuk menggunakan &&. Pengendali 'Mengambil Data' && this.state.data akan mengembalikan this.state.data tanpa mengira sama ada ia tidak ditentukan atau tidak.
Rantai pilihan
Seseorang mungkin mencadangkan menggunakan rantaian pilihan apabila cuba mengembalikan harta benda jauh ke dalam struktur pokok. Jadi, simbol tanda tanya? boleh digunakan untuk mendapatkan semula harta hanya jika ia tidak batal.
Sebagai contoh, kita boleh memfaktorkan semula contoh di atas untuk mendapatkan this.state.data?..(). Iaitu, data dikembalikan hanya jika nilainya tidak batal.
Atau, jika penting sama ada keadaan ditakrifkan atau tidak, kami boleh mengembalikan this.state?.data.
Tukar kepada Boolean
PENUKARAN JENIS
Sebagai tambahan kepada fungsi boolean biasa benar dan salah, JavaScript juga menganggap semua nilai lain sebagai benar atau palsu.
Sehingga dinyatakan sebaliknya, semua nilai dalam JavaScript adalah benar, kecuali 0, "", null, undefined, NaN dan, sudah tentu, palsu. Yang terakhir adalah palsu.
Kita boleh menukar antara keduanya dengan mudah menggunakan operator !, yang juga menukar jenis kepada boolean.
Mungkin terdapat situasi di mana + akan ditafsirkan sebagai pengendali gabungan dan bukannya pengendali penambahan. Untuk mengelakkan ini, anda harus menggunakan tildes: ~~. Operator ini bersamaan dengan -n-1. Sebagai contoh, ~15 bersamaan dengan -16.
Menggunakan dua tilde berturut-turut menafikan operasi kerana - (- - n - 1) - 1 = n + 1 - 1 = n. Dengan kata lain, ~-16 bersamaan dengan 15.
Bermula dalam ES7, anda boleh menggunakan operator eksponen ** sebagai singkatan untuk kuasa. Ini adalah lebih pantas daripada menggunakan Math.pow(2, 3). Nampaknya mudah, tetapi perkara ini termasuk dalam senarai teknik, kerana ia tidak disebut di mana-mana.
console.log(2 ** 3); // Result: 8
Ia tidak boleh dikelirukan dengan simbol ^, yang biasa digunakan untuk eksponen. Tetapi dalam JavaScript ini adalah pengendali XOR.
Sebelum ES7, pintasan ** hanya boleh digunakan untuk kuasa asas 2 menggunakan operator anjakan kiri bitwise <<:
Math.pow(2, n);
2 << (n - 1);
2**n;
Sebagai contoh, 2 << 3 = 16 bersamaan dengan 2 ** 4 = 16.
Terapung kepada integer
OPERASI / PENUKARAN JENIS
Jika anda perlu menukar apungan kepada integer, anda boleh menggunakan Math.floor(), Math.ceil() atau Math.round(). Tetapi ada cara yang lebih pantas, untuk ini kami menggunakan |, iaitu operator OR.
Tingkah laku | bergantung pada sama ada anda berurusan dengan nombor positif atau negatif, jadi kaedah ini hanya sesuai jika anda yakin dengan apa yang anda lakukan.
n | 0 mengalih keluar segala-galanya selepas pemisah perpuluhan, memotong apungan kepada integer.
Anda boleh mendapatkan kesan pembundaran yang sama menggunakan ~~. Selepas penukaran paksa kepada integer, nilai kekal tidak berubah.
Mengalih keluar nombor belakang
Operator OR boleh digunakan untuk mengeluarkan sebarang nombor digit daripada nombor. Ini bermakna kita tidak perlu menukar jenis seperti di sini:
let str = "1553";
Number(str.substring(0, str.length - 1));
Notasi anak panah ES6 boleh digunakan dalam kaedah kelas, dan pengikatan tersirat. Ini bermakna anda boleh mengucapkan selamat tinggal kepada ungkapan berulang seperti ini.myMethod = this.myMethod.bind(this)!