前の言葉
配列は、順番に配置された一連の値であり、オブジェクトのプロパティ名と比較して整理されていません。基本的に、配列は数字をルックアップキーとして使用し、オブジェクトにはユーザー定義の属性名があります。 JavaScriptには実際の連想配列はありませんが、オブジェクトを使用して連想の機能を実装できます
array()は、特別なタイプのオブジェクト()にすぎません。つまり、array()インスタンスは基本的に、追加の機能を備えたオブジェクト()インスタンスです。配列は、いつでも更新または削除できる任意のタイプの値を保持でき、配列のサイズは動的に調整されます。
オブジェクトに加えて、配列配列タイプはおそらくJavaScriptで最も一般的に使用されるタイプです。さらに、JavaScriptの配列は、他のほとんどの言語の配列とはまったく異なります。この記事では、javascriptに配列配列タイプを紹介します
配列を作成します
Arrayを作成するには、リテラル構文の使用とArray()コンストラクターを使用する2つの方法があります。
【リテラル】
配列リテラルを使用することは、配列を作成する最も簡単な方法です。正方形の括弧内にコンマが付いた別々の配列要素
var empty = []; //要素のない配列var primes = [2,3,5,7,11]; // 5つの値の配列
JavaScriptアレイは、他の言語のデータと他の言語の配列の順序付けられたリストですが、他の言語とは異なり、JavaScriptアレイの各アイテムはあらゆるタイプのデータを保持できます
var misc = [1.1、true、 "a"]; //異なるタイプの3つの要素
配列リテラルの値は定数である必要はありません、それらは任意の表現である可能性があります
var base = 1024; var table = [base、base+1、base+2、base+3];
オブジェクトリテラルまたはその他の配列リテラルを含めることができます
var b = [[1、{x:1、y:2}]、[2、{x:3、y:4}]];配列の要素がまだ配列である場合、多次元配列が形成されます
var a = [[1、2]、[3、4]];
[注]数値リテラル表記を使用する場合、アレイコンストラクターは呼び出されません
【コンストラクタ】
コンストラクターを呼び出す方法は3つあります
【1】パラメーターなし、空の配列を作成します
//このメソッドは、要素のない空の配列を作成します。これは、配列[] var a = new Array()の直接数量に相当します。
【2】配列の長さを指定するために使用される数値パラメーターがあります
var a = new Array(10); console.log(a); // [] console.log(a [0]、a.length); // undefined 10
[注]別のタイプのパラメーターがある場合、その値の1つのみを含む配列が作成されます
var a = new Array('10 '); console.log(a); // [' 10 '] console.log(a [0]、a.length); // 10 1
【3】複数のパラメーターがある場合、パラメーターは配列の特定の要素として表されます
var a = new Array(1,2,3); console.log(a); // [1,2,3] console.log(a [0]、a [1]、a [2]); // 1 2 3
array()コンストラクターを使用する場合、新しいオペレーターは省略できます
var a1 = array(); var a2 = array(10); var a3 = array(1,2,3); console.log(a1、a2、a3); // [] [] [1,2,3]
アレイの性質
配列は、順番に配置された一連の値です。本質的に、配列は特別なオブジェクトです。
typeof [1、2、3] //「オブジェクト」
配列の特殊性は、そのキー名が整数の整数(0、1、2…)のセットであるということに反映されています。配列メンバーのキー名は固定されているため、配列は各要素のキー名を指定する必要はありませんが、オブジェクトの各メンバーはキー名を指定する必要があります。
var arr = ['a'、 'b'、 'c']; console.log(object.keys(arr)); // ["0"、 "1"、 "2"] var obj = {name1: 'a'、name2: 'b'、name3: 'c'};配列は、オブジェクトの特別な形式です。四角い括弧で配列要素にアクセスすることは、角括弧付きのオブジェクトのプロパティにアクセスするようなものです。
JavaScript言語は、オブジェクトのキー名が文字列であると規定しているため、配列のキー名は実際には文字列です。数値で読み取ることができる理由は、非弦のキー名が文字列に変換され、属性名として使用されるためです
o = {}; //通常のオブジェクトを作成o [1] = "one"; //整数でそれをインデックスする//数値キー名は文字列var arr = ['a'、 'b'、 'c']; arr ['0'] // 'a'arr [0] //' a 'に自動的に変換されますただし、配列インデックスとオブジェクト属性名を区別する必要があります。すべてのインデックスは属性名ですが、0〜232-2(4294967294)の間の整数属性名のみがインデックスです
var a = []; // index a ['1000'] = 'abc'; a [1000] // 'abc' // index a [1.00] = 6; a [1] // 6
[注]個々の値は識別子として使用できません。したがって、アレイメンバーは正方形の括弧でのみ表現できます
var arr = [1、2、3]; arr [0]; // 1arr.0; // syntaxerror
アレイは、ネガティブまたは非整数数を使用してインデックス作成できます。ただし、32 -2の電力まで0〜2の範囲内ではないため、配列の属性名のみであり、配列のインデックスではありません。明らかな機能は、配列の長さを変更しないことです
var a = [1,2,3]; //属性name a [-1.23] = true; console.log(a.length);/3 // index a [10] = 5; console.log(a.length);/11 //属性a属性a ['abc'] = 'testing'; console.log(a.length); // 11/ 11/ 11/ 11
スパースアレイ
スパースアレイは、0から始まる不連続なインデックスを含む配列です。
【1
var a = [1,2,3,4,5];削除a [1]; console.log(a [1]); // undefinedConsole.log(1 in a); // false
【2】配列のコンマ間で要素値を省略でき、要素値を省略してスパースアレイを作成できます。
var a = [1、、3,4,5]; console.log(a [1]); // undefinedconsole.log(1 in a); // false
[注]省略された要素値と、値が定義されていない要素値には違いがあります。
var a = [1、、3,4,5]; console.log(a [1]); // undefinedconsole.log(1 in a); // falsevar a = [1、undefined、3,4,5]; console.log(a [1]); // undefinedconsole.log(1 in a); // true
配列の最後にコンマを使用する場合、ブラウザには違いがあります。コンマは標準のブラウザでは無視され、IE8-ブラウザは最後に未定義の値を追加します
//標準のブラウザー出力[1,2]、IE8-ブラウザー出力[1,2、未定義] var a = [1,2、]; console.log(a); //標準ブラウザー出力2、serpnitaryブラウザー出力3var a = [,,]; console.log(a.length);
十分にまばらな配列は、通常、実装では密な配列よりも遅く、メモリの利用率が高くなります。そのような配列の要素を検索する時間は、通常のオブジェクトのプロパティを検索する時間までです。
配列の長さ
各配列には長さの属性があります。これは、従来のJavaScriptオブジェクトと区別するこの属性です。密度の高い(つまり、非スパル)アレイの場合、長さ属性値は配列内の要素の数を表し、その値はアレイの最大のインデックスよりも1大きいです。
[] .length // => 0:配列には要素がありません['a'、 'b'、 'c']。長さ// => 3:最大インデックスは2、長さは3です
配列がスパースアレイの場合、長さ属性値は要素の数よりも大きくなります。同様に、その値はアレイの最大のインデックスよりも1大きいです
[、、]。長さ; //3(Array(10).length ;//10var a = [1,2,3]; console.log(a.length); // 3delete a [1]; console.log(a.length); // 3
配列の特異性は、主にアレイの長さを動的に調整できるという事実に反映されています。
【1 ray配列要素に値を割り当て、インデックスIが既存の配列の長さ以上を割り当てる場合、長さ属性の値はI+1に設定されます
var arr = ['a'、 'b']; arr.length // 2arr [2] = 'c'; arr.length // 3arr [9] = 'd'; arr.length // 10arr [1000] = 'e'; arr.length // 1001
【2】現在の長さよりも小さい非陰性整数nに長さの属性を設定すると、現在の配列インデックス値がn以上の要素が削除されます。
a = [1,2,3,4,5]; // 5つの要素の配列からa.length = 3; //現在は[1,2,3] a.length = 0; //すべての要素を削除します。 aは[] a.length = 5; //長さは5ですが、新しいような要素はありません
配列(5)
[注]配列をクリアする効果的な方法は、長さプロパティを0に設定することです
var arr = ['a'、 'b'、 'c']; arr.length = 0; arr // []
【3】配列の長さ属性値を現在の長さより大きく設定します。実際、これはアレイに新しい要素を追加するわけではなく、配列の端に空の領域を作成するだけです
var a = ['a']; a.length = 3; console.log(a [1]); // undefinedConsole.log(1 in a); // false
長さが違法値(つまり、範囲0--232-2の外側の値)に設定されている場合、JavaScriptはエラーを報告します
//ネガティブ値を設定します[]。長さ= -1 // rasinError:無効な配列長//配列要素の数は32 []。
配列は本質的にオブジェクトであるため、アレイに属性を追加できますが、これは長さ属性の値に影響しません
var a = []; a ['p'] = 'abc'; console.log(a.length); // 0a [2.1] = 'abc'; console.log(a.length); // 0
アレイトラバーサル
ループ用の配列要素をループする最も一般的な方法
var a = [1、2、3];
もちろん、時間のループを使用することもできます
var a = [1、2、3]; var i = 0; while(i <a.length){console.log(a [i]); i ++;} var l = a.length; while(l- - ){console.log(a [l]);}ただし、配列がスパースアレイの場合は、forループを使用すると、いくつかの条件を追加する必要があります
//非存在要素var a = [1 ,,, 2];
また、ループを使用してスパースアレイを処理することもできます。ループは、列挙可能な属性名(配列インデックスを含む)を一度にループ変数に割り当てます。存在しないインデックスは通過しません
var a = [1 ,,, 2];
for/inループは、array.prototypeに追加されたメソッドなど、継承された属性名を列挙できるためです。このため、追加の検出方法を使用して不要なプロパティをフィルタリングしない限り、for for inループを配列に使用しないでください
var a = [1 ,,, 2]; ab = 'b'; for(var i in a){console.log(a [i]); // 1 2 'b'} //スキップivar a = [1 ,,, 2]; ab = 'b';続行; console.log(a [i]); // 1 2}JavaScriptの仕様により、ループ/inループが異なる注文でオブジェクトのプロパティを通過できます。通常、配列要素のトラバーサル実装は昇順ですが、このようになることは保証できません。特に、配列にオブジェクト属性と配列要素の両方がある場合、返された属性名は、数値サイズの順序ではなく作成された順序で可能性があります。アルゴリズムがトラバーサルの順序に依存している場合、使用するのではなく、通常のループに通常使用することが最善です
クラスアレイ
長さの属性と対応する非陰性整数属性を持つオブジェクトは、配列のようなオブジェクトと呼ばれます
//クラスアレイデモンストレーションvar a = {}; var i = 0; while(i <10){a [i] = i*i; i ++;} a.length = i; var total = 0;3つの一般的なクラス配列オブジェクトがあります。
【1】引数オブジェクト
// object function args(){return arguments} var arraylike = args( 'a'、 'b'); arraylike [0] // 'a'arraylike.length // 2arraylike instance of array // falsedomメソッド(document.getElementsbytagname()メソッドなど)によって返される2】オブジェクト
// dom element var elts = document.getelementsbytagname( 'h3'); elts.length // 3elts instanceof array // false
【3】文字列
// string 'abc' [1] // 'b''abc'.length // 3'abc'配列のインスタンス// false
[注]文字列は不変の値であるため、配列と見なされると、読み取り専用です。たとえば、push()、sort()、reverse()、splice()、およびその他の配列メソッドは、配列を変更します。それらは文字列に無効であり、エラーを報告します
var str = 'abc'; array.prototype.foreach.call(str、function(chr){console.log(chr); // abc}); array.prototype.splice.call(str、1); console.log(str); // typeerror:[オブジェクトストリング]のプロパティを削除できません。配列のスライス方法は、クラス配列オブジェクトを実際の配列に変換します
var arr = array.prototype.slice.call(arraylike);
JavaScriptアレイメソッドは一般的に定義されているため、実際の配列だけでなくクラスアレイオブジェクトでも正しく機能します。 ECMAScript5では、すべての配列メソッドが一般的です。 ECMAScript3では、toString()およびtolocalestring()を除くすべての方法も一般的です
var a = {'0': 'a'、 '1': 'b'、 '2': 'c'、length:3}; array.prototype.join.call(a、 '+'); // 'a+b+c'array.p rototype.slice.call(a、0); // ['a'、 'b'、 'c'] array.prototype.map.call(a、function(x){return x.touppercase();}); // ['a'、 'b'、 'c']