目次
バージョンに注意してください
ホームページ ウェブフロントエンド jsチュートリアル jsで配列を素早く初期化する方法

jsで配列を素早く初期化する方法

Sep 09, 2017 am 10:43 AM
javascript 初期化 速い

タグ (スペースで区切られています): apply


バージョンに注意してください

コードを書くとき、通常、配列を素早く初期化する必要があります。たとえば、zeros に似た関数が必要です。ここで必要な場合は、1 日 24 時間を表す 0 ~ 23 の配列を生成します。 zeros函数,假如这里我们需要生成一个0-23的数组用于表示一天24小时。
最基本的做法如下:

function(){
    let hours = [];    
    for(let k = 0; k < 24; k++ )
    hours.push(k);    
    return hours;
}
ログイン後にコピー

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

Array(24).map((_, h) => h);
ログイン後にコピー

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

let a = [];
a[1000] = 2;
console.log(a.length);// 1000a.forEach(x => console.log("hello"));// only one "hello"
ログイン後にコピー

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

function(len){
    let r = [];
    r.length = len;    
    return r;
ログイン後にコピー

这就是为什么对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]
ログイン後にコピー

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

// 借用call
Array.call(null, ...Array(24)).map((_, h) => h);
// [0, 1... 23]
ログイン後にコピー

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

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

// Array本身
Array(...Array(24)).map((_, h) => h);
// [0, 1, ..., 24]
ログイン後にコピー

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

// 推荐
Array(24).fill(null).map((_, h) => h);
ログイン後にコピー

现在也比较推荐最后一种写法,这种方法也最为直观。
不过需要注意fill最も基本的なアプローチは次のとおりです:

// 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
ログイン後にコピー
よりエレガントな方法で実装する方法を考えてみましょう。

これを実現するには、new Array(24) + map メソッドの使用を検討してください。

コードは次のとおりです:
rrreee
ここでの map の 2 番目のパラメータはインデックスですが、ここではインデックスが数値として使用されていることに注意してください。 🎜結果が期待と一致しません。なぜですか? 🎜簡単に検索したところ、js の疎配列のロジックが原因であることがわかりました。 🎜まず次のコードを見てみましょう: 🎜rrreee🎜 js の処理ロジックは、値がアクティブに割り当てられていない位置の「空席」を処理することです。これらの不明な「空席」については、イテレーターは処理しません。最も重要なことは、これを行うことです。目的は、無理な代入操作によって引き起こされるバグを回避することです。 🎜そのようなロジックはなく、new Array(Date.now()) を記述するとします。これにより、システムは非常に大きな配列を作成しますが、実際には何も保存されません。 🎜new Array(len) が何を行うのかは、次のプロセスのように簡単に理解できます: 🎜rrreee🎜これが、map が <code>new Array(len) で呼び出される理由です。 /code> または forEach は期待と一致しません。 🎜この問題を解決するには、new Array(len) を使用する以外に、new Array(1,2,3) を使用して配列を初期化することもできます。この方法では、初期化された配列を書き込むという目的は達成されません。 🎜今回は apply を考えましたが、この関数の 2 番目のパラメータは配列であるため、次のコードを書きました。 🎜rrreee🎜期待通りの結果が得られました。これは、Array(24)apply のパラメータとして使用される場合、24 個の値として扱われることを意味します。これにより、最終的な配列の長さが 24 になることが保証されます。 🎜この場合、もちろん apply の姉妹関数 call も使用できます。 🎜rrreee🎜 これは、Array(len) の分解では 1 つのパラメータではなく len パラメータを取得することも確認しています。もちろん、call は必要です構造化演算子をサポートする環境で使用できます。 🎜🎜 callapply の原則に慣れたら、さらに次のコードを書くことができます: 🎜rrreee🎜 このフォームは十分にエレガントです。 🎜さらに、ES6 では、Array は新しいメソッド fill を提供します。これを使用して、これらの「空き」ビットを埋めて、その後の動作を保証できます。スムーズに操作を進めることができます。 🎜具体的なコードは次のとおりです: 🎜rrreee🎜 ここで、最も直観的な最後の書き方もお勧めします。 🎜 ただし、fill メソッドの使用に注意する必要があり、ブラインドフィルは避けるようにしてください。これは、JS の「空」ロジックが設計されているという上記のバグを引き起こすためです。避けるために。 🎜興味がある場合は、次のコードを試してみてください: 🎜rrreee🎜 ブラウザで試してみると、ブラウザは基本的に応答しません。結果が得られないように、より大きな値を設定しませんでした。 int が 4 バイトのメモリを占有すると仮定すると、この fill は 200M のメモリを占有し、5,000 万回ループする必要があります。これは必然的に大量の CPU とメモリを占有することになりますが、これはシングルスレッドの JS では絶対に許可されません。 🎜🎜🎜

以上がjsで配列を素早く初期化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ダイナミック リンク ライブラリの初期化ルーチンが失敗した場合の対処方法 ダイナミック リンク ライブラリの初期化ルーチンが失敗した場合の対処方法 Dec 29, 2023 am 10:30 AM

解決策: 1. アプリケーションを再インストールします; 2. DLL を修復または再インストールします; 3. システムの復元またはチェックポイントの回復; 4. システム ファイル チェッカー (SFC) を使用してスキャンします; 5. スタートアップ項目とサービスを確認します; 6. ツールを使用します; 7.公式ドキュメントやフォーラムを確認する; 8. セキュリティ ソフトウェアを検討する; 9. イベント ビューアを確認する; 10. 専門家の助けを求めるなど。

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

win7でパソコンを初期化する方法 win7でパソコンを初期化する方法 Jan 07, 2024 am 11:53 AM

win7 システムは非常に優れた高性能システムであり、win7 を継続的に使用していると、多くの友人が win7 でコンピュータを初期化する方法を尋ねてきます。今日は、エディターが win7 コンピューターの工場出荷時の設定を復元する方法を紹介します。 win7 でコンピュータを初期化する方法に関する関連情報: 画像とテキストによる詳細な手順 手順: 1. 「スタート メニュー」を開いて入ります。 2. 左側の下部をクリックして設定を入力します。 3. Win10 の更新と回復の設定インターフェイスで、選択します。 4. 以下の「すべてのコンテンツを削除して Windows を再インストールする」をクリックします。 5. 以下の「初期化」設定が表示されるので、クリックします。 6. 「コンピュータには複数のドライブがあります」設定オプションを入力します ここには 2 つのオプションがあり、状況に応じて選択できます。

SpringBoot と SpringMVC の違いと比較を理解する SpringBoot と SpringMVC の違いと比較を理解する Dec 29, 2023 am 09:20 AM

SpringBoot と SpringMVC を比較し、その違いを理解する Java 開発の継続的な発展に伴い、Spring フレームワークは多くの開発者や企業にとって最初の選択肢となっています。 Spring エコシステムでは、SpringBoot と SpringMVC の 2 つの非常に重要なコンポーネントです。どちらも Spring フレームワークをベースにしていますが、機能や使用方法にいくつかの違いがあります。この記事では、SpringBoot と Spring の比較に焦点を当てます。

win7のネットワーク設定をリセットする方法 win7のネットワーク設定をリセットする方法 Dec 26, 2023 pm 06:51 PM

win7 システムは非常に優れた高性能システムです。最近、多くの win7 システムの友人が win7 のネットワーク設定を初期化する方法を探しています。今日は、エディターが win7 コンピュータのネットワーク初期化の詳細を紹介します。見てみましょう。チュートリアルを見てください。 win7 でネットワーク設定を初期化する方法に関する詳細なチュートリアル: グラフィカルな手順: 1. [スタート] メニューをクリックし、[コントロール パネル] を見つけて開き、[ネットワークと共有センター] をクリックします。 2. 次に、「アダプターデバイスの変更」を見つけてクリックします。 3. 次に、開いたウィンドウで「ローカル エリア接続」を右クリックし、「プロパティ」をクリックします。 4. 開いたら、「インターネット プロトコル バージョン (TCP/IPv4)」を見つけてダブルクリックします。

PCでグラフィックスシステムを初期化できないエラーを修正 PCでグラフィックスシステムを初期化できないエラーを修正 Mar 08, 2024 am 09:55 AM

多くのゲーマーは、ゲームがグラフィックス システムの初期化に失敗するというイライラする問題に遭遇したことがあります。この記事では、この問題の背後にある一般的な理由を詳しく掘り下げ、すぐにボードに戻ってレベルをクリアできるシンプルかつ効果的な解決策を見つけます。したがって、Rollercoaster Tycoon、Assassin’s Creed、Tony Hawk’s Pro Skater などで「グラフィック システムを初期化できません」というエラー メッセージが表示される場合は、この記事で説明されている解決策に従ってください。初期化エラー グラフィックス システムを初期化できません。グラフィックカードはサポートされていません。グラフィックス システムを初期化できないエラー メッセージを修正する Rollercoaster Tycoon、Assassin's Creed、Tony Hawk's Pro Skater などのゲームでのグラフィックス システムを初期化できないエラー メッセージを解決するには、次の回避策を試すことができます。互換モード

Win11 の「マイ コンピュータ」パスの違いは何ですか?すぐに見つけられる方法! Win11 の「マイ コンピュータ」パスの違いは何ですか?すぐに見つけられる方法! Mar 29, 2024 pm 12:33 PM

Win11 の「マイ コンピュータ」パスの違いは何ですか?すぐに見つけられる方法! Windows システムは常に更新されているため、最新の Windows 11 システムにもいくつかの新しい変更と機能が追加されています。よくある問題の 1 つは、Win11 システムでユーザーが「マイ コンピューター」へのパスを見つけられないことですが、これは通常、以前の Windows システムでは簡単な操作でした。この記事では、Win11 システムでの「マイ コンピュータ」のパスの違いと、それらをすばやく見つける方法を紹介します。 Windows1の場合

WordPress Web サイト構築ガイド: 個人用 Web サイトをすばやく構築する WordPress Web サイト構築ガイド: 個人用 Web サイトをすばやく構築する Mar 04, 2024 pm 04:39 PM

WordPress Web サイト構築ガイド: 個人用 Web サイトを素早く構築する デジタル時代の到来により、個人用 Web サイトを持つことが流行し、必要なものになりました。最も人気のある Web サイト構築ツールである WordPress を使用すると、個人の Web サイトをより簡単かつ便利に構築できます。この記事では、具体的なコード例を含め、個人用 Web サイトをすばやく構築するためのガイドを提供します。自分の Web サイトを持ちたいと考えている友人の助けになれば幸いです。ステップ 1: ドメイン名とホスティングを購入する 個人 Web サイトの構築を始める前に、まず独自の Web サイトを購入する必要があります

See all articles