Jadual Kandungan
笔记版
Rumah hujung hadapan web tutorial js 如何用js快速地初始化数组

如何用js快速地初始化数组

Sep 09, 2017 am 10:43 AM
javascript permulaan cepat

标签(空格分隔): call apply


笔记版

编写代码中通常会有快速初始化数组的需求,例如我们需要一个类似matlab里的zeros函数,假如这里我们需要生成一个0-23的数组用于表示一天24小时。
最基本的做法如下:

function(){
    let hours = [];    
    for(let k = 0; k < 24; k++ )
    hours.push(k);    
    return hours;
}
Salin selepas log masuk

下面我们来思考如何用更优雅的方式实现。
考虑使用new Array(24)+ map的方法来实现。
代码如下:

Array(24).map((_, h) => h);
Salin selepas log masuk

注意,这里map的第二个参数是索引,平时用的少,这里把索引作为数值。
结果与预期并不符合,为啥呢?
简单搜索了一下,发现时因为js里的稀疏数组的逻辑导致的。
我们先看一下下面的代码:

let a = [];
a[1000] = 2;
console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"
Salin selepas log masuk

js的处理逻辑是,对于没有主动赋值的位置进行“空置”处理,对于这些“空置”未知,迭代器是不会理会的,这么做最主要的目的就是避免不合理的赋值操作导致的bug。
假设没有这种逻辑,我们写下了new Array(Date.now()),这将导致系统新建一个非常大的数组,而实际上啥也没存。
我们可以吧new Array(len)干的事情简单理解为下面的过程:

function(len){
    let r = [];
    r.length = len;    
    return r;
Salin selepas log masuk

这就是为什么对new Array(len)调用map或者forEach的时候跟预期不一致了。
如何解决这一问题呢,除了使用new Array(len)的形式,我们还可以使用new Array(1,2,3)这种写法来初始化数组,但是这么写就没法实现我们编写初始化数组的目的了。
这个时候我们想到了apply,这个函数的第二个参数正好就是一个数组,于是我们写下了下面的代码。

// 借用apply
Array.apply(null, Array(24)).map((_, h) => h);
// [0, 1, ..., 24]
Salin selepas log masuk

得到了我们希望的结果。这就说明,Array(24)apply中作为参数的时候是被当做24个值对待的,因为这一点就保证了最后得到的数组长度是24。
既然如此,我们当然同样可以使用apply的姊妹函数call

// 借用call
Array.call(null, ...Array(24)).map((_, h) => h);
// [0, 1... 23]
Salin selepas log masuk

这也更确认了一件事,Array(len)解构会得到len个参数而非一个参数,当然call的使用必须在支持解构操作符的环境中。

在熟悉了callapply的原理后,我们可以进一步写出下面的代码:

// Array本身
Array(...Array(24)).map((_, h) => h);
// [0, 1, ..., 24]
Salin selepas log masuk

这种形式已经足够优雅了。
另外,在ES6中,Array提供了新方法fill,借用该方法填充那些“空置”位,进而保证后续的操作能顺利进行。
具体代码如下:

// 推荐
Array(24).fill(null).map((_, h) => h);
Salin selepas log masuk

现在也比较推荐最后一种写法,这种方法也最为直观。
不过需要注意fill方法的使用,应该尽量避免盲目地填充,因为这样会上面提到了js设计“空置”逻辑为了避免的bug。
有兴趣的可以尝试一下下面的代码:

// no-fillconsole.time("no-fill");let t = Array(5e7);console.timeEnd("no-fill");// fillconsole.time("fill");let q = Array(5e7).fill(null);console.timeEnd("fill");// => no-fill: 0.240ms// => fill: 3247.921ms
Salin selepas log masuk

在浏览器中尝试浏览器基本会不响应,没有设置更大的数值为了避免得不到结果。假设一个int占用4个字节的内存,这个fill会占用200M的内存,且需要循环5千万次,这必然会占用大量的CPU和内存,在单线程的js中是绝对不允许的。

Atas ialah kandungan terperinci 如何用js快速地初始化数组. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perkara yang perlu dilakukan jika rutin permulaan perpustakaan pautan dinamik gagal Perkara yang perlu dilakukan jika rutin permulaan perpustakaan pautan dinamik gagal Dec 29, 2023 am 10:30 AM

Penyelesaian: 1. Pasang semula aplikasi; 2. Membaiki atau memasang semula DLL; Semak dokumentasi atau forum rasmi;

Bagaimana untuk memulakan komputer dalam win7 Bagaimana untuk memulakan komputer dalam win7 Jan 07, 2024 am 11:53 AM

Sistem win7 adalah sistem berprestasi tinggi yang sangat baik Semasa penggunaan win7 secara berterusan, ramai rakan bertanya bagaimana untuk memulakan komputer dalam win7! Hari ini, editor akan membawa anda cara memulihkan tetapan kilang komputer win7. Maklumat berkaitan tentang cara untuk memulakan komputer dalam win7: Arahan terperinci dengan gambar dan teks Langkah: 1. Buka "Menu Mula" dan masukkan. 2. Klik untuk memasukkan tetapan di bahagian bawah sebelah kiri. 3. Dalam antara muka tetapan kemas kini dan pemulihan Win10, pilih. 4. Klik di bawah "Alih keluar semua kandungan dan pasang semula Windows". 5. Anda boleh melihat tetapan "Permulaan" berikut, dan kemudian klik. 6. Masukkan pilihan tetapan "Komputer anda mempunyai beberapa pemacu" Terdapat dua pilihan di sini, anda boleh memilih mengikut situasi.

WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata WebSocket dan JavaScript: teknologi utama untuk melaksanakan sistem pemantauan masa nyata Dec 17, 2023 pm 05:30 PM

WebSocket dan JavaScript: Teknologi utama untuk merealisasikan sistem pemantauan masa nyata Pengenalan: Dengan perkembangan pesat teknologi Internet, sistem pemantauan masa nyata telah digunakan secara meluas dalam pelbagai bidang. Salah satu teknologi utama untuk mencapai pemantauan masa nyata ialah gabungan WebSocket dan JavaScript. Artikel ini akan memperkenalkan aplikasi WebSocket dan JavaScript dalam sistem pemantauan masa nyata, memberikan contoh kod dan menerangkan prinsip pelaksanaannya secara terperinci. 1. Teknologi WebSocket

Bagaimana untuk menetapkan semula tetapan rangkaian win7 Bagaimana untuk menetapkan semula tetapan rangkaian win7 Dec 26, 2023 pm 06:51 PM

Sistem win7 adalah sistem berprestasi tinggi yang sangat baik Baru-baru ini, ramai rakan sistem win7 sedang mencari cara untuk memulakan tetapan rangkaian dalam win7 Hari ini, editor akan membawakan kepada anda butiran permulaan rangkaian komputer win7 tengok tutorial. Tutorial terperinci tentang cara untuk memulakan tetapan rangkaian dalam win7: Langkah grafik: 1. Klik menu "Mula", cari dan buka "Panel Kawalan", dan kemudian klik "Pusat Rangkaian dan Perkongsian". 2. Kemudian cari dan klik "Tukar Peranti Penyesuai". 3. Seterusnya, dalam tetingkap yang terbuka, klik kanan "Sambungan Kawasan Setempat" dan kemudian klik "Properties". 4. Selepas membukanya, cari "Internet Protocol Version (TCP/IPv4)" dan dua kali ganda

Betulkan Tidak dapat memulakan ralat sistem grafik pada PC Betulkan Tidak dapat memulakan ralat sistem grafik pada PC Mar 08, 2024 am 09:55 AM

Ramai pemain telah menghadapi isu yang mengecewakan permainan gagal untuk memulakan sistem grafik. Artikel ini akan menyelidiki sebab biasa di sebalik masalah ini dan mencari penyelesaian yang mudah tetapi berkesan yang akan membawa anda kembali ke papan dan mengatasi tahap dalam masa yang singkat. Jadi, jika anda mendapat Tidak dapat memulakan mesej ralat sistem grafik dalam Rollercoaster Tycoon, Assassin's Creed, Tony Hawk's Pro Skater, dll., kemudian ikuti penyelesaian yang dinyatakan dalam artikel ini. Ralat Permulaan Tidak dapat memulakan sistem grafik. Kad grafik tidak disokong. Betulkan Tidak dapat memulakan mesej ralat sistem grafik Untuk menyelesaikan Tidak dapat memulakan ralat sistem grafik dalam permainan seperti Rollercoaster Tycoon, Assassin's Creed, Tony Hawk's Pro Skater, dll., anda boleh mencuba penyelesaian berikut: Kemas kini pemacu kad grafik anda dalam mod keserasian

Fahami perbezaan dan perbandingan antara SpringBoot dan SpringMVC Fahami perbezaan dan perbandingan antara SpringBoot dan SpringMVC Dec 29, 2023 am 09:20 AM

Bandingkan SpringBoot dan SpringMVC dan fahami perbezaannya Dengan pembangunan Java yang berterusan, rangka kerja Spring telah menjadi pilihan pertama bagi banyak pembangun dan perusahaan. Dalam ekosistem Spring, SpringBoot dan SpringMVC ialah dua komponen yang sangat penting. Walaupun kedua-duanya adalah berdasarkan rangka kerja Spring, terdapat beberapa perbezaan dalam fungsi dan penggunaan. Artikel ini akan menumpukan pada membandingkan SpringBoot dan Spring

Apakah perbezaan dalam laluan 'Komputer Saya' dalam Win11? Cara cepat untuk mencarinya! Apakah perbezaan dalam laluan 'Komputer Saya' dalam Win11? Cara cepat untuk mencarinya! Mar 29, 2024 pm 12:33 PM

Apakah perbezaan dalam laluan "Komputer Saya" dalam Win11? Cara cepat untuk mencarinya! Memandangkan sistem Windows sentiasa dikemas kini, sistem Windows 11 terkini turut membawakan beberapa perubahan dan fungsi baharu. Salah satu masalah biasa ialah pengguna tidak dapat mencari laluan ke "Komputer Saya" dalam sistem Win11 Ini biasanya merupakan operasi mudah dalam sistem Windows sebelumnya. Artikel ini akan memperkenalkan cara laluan "Komputer Saya" berbeza dalam sistem Win11, dan cara mencarinya dengan cepat. Dalam Windows1

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Dec 17, 2023 pm 05:13 PM

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Pengenalan: Hari ini, ketepatan ramalan cuaca sangat penting kepada kehidupan harian dan membuat keputusan. Apabila teknologi berkembang, kami boleh menyediakan ramalan cuaca yang lebih tepat dan boleh dipercayai dengan mendapatkan data cuaca dalam masa nyata. Dalam artikel ini, kita akan mempelajari cara menggunakan teknologi JavaScript dan WebSocket untuk membina sistem ramalan cuaca masa nyata yang cekap. Artikel ini akan menunjukkan proses pelaksanaan melalui contoh kod tertentu. Kami

See all articles