ホームページ ウェブフロントエンド jsチュートリアル JS_javascript スキルの Array.prototype.indexOf を拡張することによって発生する問題のディスカッションと解決策

JS_javascript スキルの Array.prototype.indexOf を拡張することによって発生する問題のディスカッションと解決策

May 16, 2016 pm 05:35 PM
array indexof

Array には、indexOf メソッドがないため、配列内の要素のインデックスを見つけるのは面倒ですが、呼び出しの便宜のために、Array.prototype.indexOf() がプロトタイプ プロトタイプを通じて拡張されており、より使いやすくなっています。 。しかし、配列を走査するときに、このカスタムのindexOfに問題がありました。

配列には、indexOf メソッドがないため、配列内の要素のインデックスを見つけるのが面倒になります。呼び出しの便宜のために、Array.prototype.indexOf() は、プロトタイプのプロトタイプによって拡張されています。より使いやすくなります。

コードをコピー コードは次のとおりです。

Array.prototype.indexOf = function(item) ) {
for (var i = 0; i < this.length; i ) {
if (this[i] == item)
return i;
}
return - 1;
}

使用する場合は、直接
コードをコピーしてください コードは次のように: >
var arr=[1,2,3,4,5];
varindex=arr.indexOf(1); //index==0


拡張後は、とても楽しくて使いやすく、調和のとれた光景です...
しかし、あるとき、配列要素を走査するときに for..in.. ループが使用され、それが別の問題を引き起こし、調和のとれた雰囲気を壊してしまいました。 。


var a=["Zhang Fei", "関羽" ,"劉備","呂布"];
for(var p in a){
document.write(p "=" a[p] "
" );
}


当初はこの 4 人の名前を出力したかったのですが、何が出力されましたか?
実際の出力は次のとおりです:
//0=張飛
//1=関羽
//2=劉備
//3=呂布
//indexOf =function( item) { for (var i = 0; i 出力のindexOfは、それ自体で展開できますが、これは理解できます。結局のところ、for..inはオブジェクトのすべてのユーザー定義属性または配列のすべての要素を走査します。
では、Firefox を使用しないのはなぜでしょうか?
情報を確認したところ、
Array はすでに JavaScript バージョン 1.6 で Array.indexOf() をサポートしており、私が使用している Firefox はバージョン 3.5 で、既に JavaScript1.8 をサポートしていることに気付きました。方法。
IE に関しては、IE8 を使用していますが、JavaScript のバージョン 1.3 のみをサポートしています。
つまり、IE8 は、indexOf を「ユーザー定義属性」と見なしますが、Firefox は、それ自体がネイティブにサポートする固有の属性と見なします。
これは本当にそうなのでしょうか?
実験を行って、indexOf の名前を myIndexOf に変更して再試行すると、IE と Firefox の両方で myIndexOf が出力され、前の点が正しいことがわかります。
ここで別の問題が発生します。長い間、indexOf を拡張してきましたが、多くのプロジェクト コードですでにこのメソッドが使用されていますが、配列自体の要素を出力するには for..in を使用する必要があります。自分で延長したくないのですが、ロシアに着いたらどうすればいいですか?
幸いなことに、JavaScript には hasOwnProperty メソッドが用意されています。
その説明を見てください:
Object から派生したすべてのオブジェクトは hasOwnProperty メソッドを継承します。このメソッドは、in 演算子とは異なり、オブジェクトがそのオブジェクトの直接プロパティとして指定されたプロパティを持っているかどうかを判断するために使用できます。オブジェクトのプロトタイプチェーンをチェックダウンしません
説明を見ると、それが私たちが望んでいることです。
for...in.. で判断するだけです。



コードをコピーします コードは次のとおりです: if(a.hasOwnProperty(p)){
document.write(p "=" a[p] "
");
}


さらに、インターネットから取得した hasOwnProperty の使用例を添付します。


コードをコピー コードは次のとおりです。

function Book(title, author) {
this.title = title;
this.author = author;
}
Book.prototype.price = 9.99;
Object.prototype.copyright = "herongyang.com";
var myBook = new Book("JavaScript Tutorials", "Herong Yang");
// Dumping built-in properties at the base prototype level
document.writeln("/nObject.prototype's built-in properties:");
dumpProperty(Object.prototype, "constructor");
dumpProperty(Object.prototype, "hasOwnProperty");
dumpProperty(Object.prototype, "isPrototypeOf");
dumpProperty(Object.prototype, "toString");
dumpProperty(Object.prototype, "valueOf");
dumpProperty(Object.prototype, "copyright");
// Dumping built-in properties at the my prototype level
document.writeln("/n==================/nBook.prototype's built-in properties:");
dumpProperty(Book.prototype, "constructor");
dumpProperty(Book.prototype, "hasOwnProperty");
dumpProperty(Book.prototype, "isPrototypeOf");
dumpProperty(Book.prototype, "toString");
dumpProperty(Book.prototype, "valueOf");
dumpProperty(Book.prototype, "copyright");
// Dumping built-in properties at the object level
document.writeln("/n==================/nmyBook's built-in properties:");
dumpProperty(myBook, "constructor");
dumpProperty(myBook, "hasOwnProperty");
dumpProperty(myBook, "isPrototypeOf");
dumpProperty(myBook, "toString");
dumpProperty(myBook, "valueOf");
dumpProperty(myBook, "copyright");
function dumpProperty(object, property) {
var inheritance;
if (object.hasOwnProperty(property))
inheritance = "Local";
else
inheritance = "Inherited";
document.writeln(property ": " inheritance ": "
object[property]);
}

查看浏览器支持javascript到哪个版本:
复制代码 代码如下:





浏览器的JavaScript版本支持测试














このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

C# の Array.Sort 関数を使用して配列を並べ替える C# の Array.Sort 関数を使用して配列を並べ替える Nov 18, 2023 am 10:37 AM

タイトル: Array.Sort 関数を使用して C# で配列を並べ替える例 本文: C# では、配列は一般的に使用されるデータ構造であり、多くの場合、配列を並べ替える必要があります。 C# には Array クラスが用意されており、このクラスには配列を簡単に並べ替えるための Sort メソッドがあります。この記事では、C# で Array.Sort 関数を使用して配列を並べ替える方法を示し、具体的なコード例を示します。まず、Array.Sort 関数の基本的な使用法を理解する必要があります。 Array.So

PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 PHPのarray_merge_recursive()関数を使用するシンプルで明確な方法 Jun 27, 2023 pm 01:48 PM

PHP でプログラミングする場合、多くの場合、配列をマージする必要があります。 PHP には、配列のマージを完了するための array_merge() 関数が用意されていますが、配列内に同じキーが存在する場合、この関数は元の値を上書きします。この問題を解決するために、PHP は配列をマージして同じキーの値を保持できる array_merge_recursive() 関数を言語で提供し、プログラム設計をより柔軟にします。配列マージ

PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 PHP で array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法 Jun 26, 2023 pm 01:41 PM

PHP には、配列操作をより便利かつ高速にする強力な配列関数が多数あります。 2 つの配列を結合して連想配列にする必要がある場合、PHP の array_combine 関数を使用してこの操作を実行できます。この関数は、実際には、ある配列のキーを別の配列の値として新しい連想配列に結合するために使用されます。次に、PHP の array_combine 関数を使用して 2 つの配列を結合して連想配列にする方法を説明します。 array_comb について学ぶ

PHPのarray_fill()関数の使い方の詳しい説明 PHPのarray_fill()関数の使い方の詳しい説明 Jun 27, 2023 am 08:42 AM

PHP プログラミングにおいて、配列は大量のデータを簡単に処理できる非常に重要なデータ構造です。 PHP は配列関連の関数を多数提供しており、array_fill() はその 1 つです。この記事では、array_fill() 関数の使い方と実際の応用におけるヒントを詳しく紹介します。 1. array_fill() 関数の概要 array_fill() 関数の機能は、同じ値で構成される指定された長さの配列を作成することです。具体的には、この関数の構文は次のとおりです。

Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Java での ArrayIndexOutOfBoundsException の一般的な原因は何ですか? Jun 24, 2023 pm 10:39 PM

Java は、さまざまな開発分野で広く使用されている非常に強力なプログラミング言語です。ただし、Java プログラミング中に、開発者は ArrayIndexOutOfBoundsException 例外に遭遇することがよくあります。では、この異常の一般的な原因は何でしょうか? ArrayIndexOutOfBoundsException は、Java の一般的なランタイム例外です。これは、データにアクセスするときに、配列の添字が配列の範囲を超えていることを意味します。一般的な理由には次のようなものがあります。

PHP の array_change_key_case() 関数の使用方法の概要 PHP の array_change_key_case() 関数の使用方法の概要 Jun 27, 2023 am 10:43 AM

PHP プログラミングでは、配列は頻繁に使用されるデータ型です。 array_change_key_case() 関数など、多数の配列操作関数もあります。この関数は、配列内のキー名の大文字と小文字を変換して、データ処理を容易にすることができます。この記事では、PHP での array_change_key_case() 関数の使用方法を紹介します。 1. 関数の構文とパラメータ array_change_ke

JavaでLinkedListを配列に変換するにはどうすればよいですか? JavaでLinkedListを配列に変換するにはどうすればよいですか? Aug 29, 2023 pm 11:09 PM

LinkedList クラスの toArray() メソッドは、現在の LinkedList オブジェクトをオブジェクト型の配列に変換して返します。この配列には、このリスト内のすべての要素が正しい順序 (最初の要素から最後の要素まで) で含まれています。これは、配列ベースの API とコレクションベースの API の間のブリッジとして機能します。そこで、LinkedList を配列に変換し、LinkedList クラスをインスタンス化します。 add() メソッドを使用してデータを設定します。上記で作成したリンク リストで toArray() メソッドを呼び出し、オブジェクトの配列を取得します。オブジェクトの配列の各要素を文字列に変換します。例 importjava.util.Arrays;importjava.uti のリアルタイム デモンストレーション

Python で Array モジュールを使用する方法 Python で Array モジュールを使用する方法 May 01, 2023 am 09:13 AM

Python の配列モジュールは事前定義された配列であるため、標準のリストよりもメモリ内で使用するスペースがはるかに少なく、追加、削除、インデックス付け、スライスなどの要素レベルの操作を高速に実行することもできます。さらに、配列内のすべての要素は同じ型であるため、平均値、最大値、最小値の計算など、配列が提供する効率的な数値演算関数を使用できます。さらに、配列モジュールは、配列オブジェクトのバイナリ ファイルへの直接の書き込みと読み取りもサポートしているため、大量の数値データを処理する際の効率が向上します。したがって、大量の同種データを処理する必要がある場合は、Python の配列モジュールを使用してコードの実行効率を最適化することを検討してください。配列モジュールを使用するには、まず次のことを行う必要があります。

See all articles