JavaScriptにおける配列特性の紹介

3077 ワード

Java言語と違って、JavaScriptの配列は三つの特性を持っています.
 
1.タイプがない.配列のメンバーは任意のタイプであってもよく、同じ配列は多くの異なるタイプのメンバから構成されてもよい.2.長さが可変です.配列の長さは動的に変化することができますので、JavaScriptには配列アクセスの越境問題がありません.3.不連続性.配列中のメンバーの位置は連続的であってもよいし、不連続であってもよい.どの配列にもlengthという属性があり、配列メンバーが連続する場合、length値は配列メンバー数と一致する.配列メンバーが連続していない場合、length値は配列メンバーの数より大きい.連続配列と比較して,不連続配列の読み書き性能は劣る.
 
実験:
 
  
var o = [42, "Sample Text", {x:88}];//JavaScript array is un-typed.
console.log(o);//[42, "Sample Text", Object {x=88}]
o[3] = 27;//JavaScript array is dynamic.
console.log(o);//[42, "Sample Text", Object {x=88}, 27]
o[5] = 99;//JavaScript array is sparse.
console.log(o);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]
上記の例からは、不連続な配列に対して、欠落したそのメンバーにアクセスすると、JavaScriptはundefinedに戻ることが示されている.配列が連続している場合、いずれかのメンバがundefinedである場合、アクセス配列の結果は同じである.
 
  
var a = [42, "Sample Text", {x:88}, 27, undefined, 99];
console.log(a);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]
配列が不連続であり、メンバーが欠落しています.配列と連続していますが、メンバーがundefinedであり、この2つの場合、配列の内容にアクセスした結果は同じです.しかし、この2つの間にはまだいくつかの微妙な違いがあり、主に配列keyへのアクセスにおいて示されている.
 
  
console.log(4 in o);//false
console.log(4 in a);//true
これらの2つの場合は、アクセスコンテンツの結果は一致していますが、その内部メカニズムは全く異なることが分かります.配列が不連続である場合、あるメンバーが欠落しています.したがって、このメンバーにアクセスすると、JavaScriptはundefinedに戻ってきます.配列が連続している場合、すべてのメンバーが存在しますが、一部のメンバーの値は特殊で、undefinedです.
上の例からも分かるように、JavaScriptの中の配列はその本質を追求するのは数字をkeyの対象とするだけで、普通のキーとオブジェクトに対しては何の違いもありません.実際には、配列を読み込み、書き込みする際に、JavaScriptはパラメータを正の整数に変換しようとします.変換に成功すると配列操作(行列のlength属性を自動更新する)を行い、失敗したらパラメータを文字列に変換して、通常のオブジェクトの読み書き操作を行います.もちろん、JavaSrpt解釈器の実装においては、配列のこのような数字をkeyとしての特性に対して多くの性能最適化がなされているので、実際の使用過程では、対象のkeyがすべて数字であるならば、直接的に配列オブジェクトを使用することはより効率的な結果を得ることができる.
配列を定義する過程において、JavaScriptは余分なカンマの出現を許可し、2つのカンマの間に配列メンバーの欠落も許可されます.
 
  
var x = [1,2,3,];//trailing comma will be omitted.
console.log(x.length);//3
        
var y = [1,,3];//member can be missed.
console.log(y);//[1, undefined, 3]
console.log(1 in y);//false
console.log(y.length);//3
配列の作成に対して、JavaScriptは4つの方法をサポートします.
1.配列オブジェクトは、上記のいくつかの例の中かっこ式のような字面量で直接作成します.2.Aray()構造関数を使用して、いかなるパラメータも入ってきません.この場合、空の配列が作成されます.効果は[]に等しいです.3.アレー()構造関数を使って、行列の長さとして正の整数が入ってきます.この場合、JavaScriptは対応するメモリ空間を予約してこの配列を記憶する.注目すべきは、配列のkeyは定義されていない、つまり配列の中にはメンバーがいないということである.その効果は、[、、]という書き方と同じです.4.アーラ()構造関数を使って、配列のメンバーに入ってきます.
実験:
 
  
var z = new Array(10);//pre-allocate memory, but no index is defined yet.
console.log(3 in z);//false

var m = new Array(42, 33, 99, "test", {k:99});
console.log(m);//[42, 33, 99, "test", Object {k=99}]

ECMAScript 5標準では、あるオブジェクトが配列であるかどうかをAray.isAray()で判断することができます.
 
  
Array.isArray([]);//true
Array.isArray({});//false