Javscript Aray検討


Javscript Arayは対象ですが、typeof[]==='object'はシステム内のオブジェクトタイプとして私達が作ったオブジェクトとは異なります.
 
次のコード:
 
Array.prototype.custom=function(){
	alert('custom');
};
var f=[1];
f.custom();

for(var i in f) {
    alert(i +' - '+f[i]);
}

f['0']=2;
alert(f[0]);

f['a']=1;

//         
for(var i in f) {
    alert(i +' - '+f[i]);
}

alert(f.length);
じゃ、自分でシミュレーションしたArayを見てみます.
 
function EmulateArray() {
   this.length=0;
}

EmulateArray.prototype.substring=function(){alert(1);};

var x=new EmulateArray();

//           
for(var i in x) {
    alert(i +'-'+x[i]);
}
 
 
では、システムの原生オブジェクト(特にAray)と私達が普段自分で作っているオブジェクトの違いをまとめましょう.
 
1.配列は実際には下付き属性で、下付き値がこの属性値のオブジェクトに対応し、属性は数字に変換されて自動的に下付き数字になります.(注意:通常のオブジェクト属性値の数字と数字文字列も区別されず、属性として数値文字列に変換されます.)2.for inサイクル配列属性の場合、配列の方法やlength属性は表示されません.配列のすべてのユーザ設定属性(Aray類に含まれる属性、方法)のみが表示されます.数字と非数値属性が含まれます.方法3.lengthは、実際には配列オブジェクトの最大のデジタル属性値+1に等しい.f[x]にアクセスすると、実際にはfオブジェクトのx属性にアクセスし、
5.同じようにnew String()、new Date()に対してnew Number....for inに対しては何の出力もありません.
 
 
ps:Arayについて  タイプの判断:
 
1.構造関数を直接判断する
 
x&x.com nstructor==Aray
短所:異なるwindowから来たと判断した場合、frameの配列オブジェクトは無効になります.
 
2.アヒル判断(duck judge)
x&typeof x.length=='number'&typeof x.splice==='function'&
!x.propertyIs Enumerable('length')
短所:100%判断できない
 
3.簡潔なプラットフォームに関する判断
x&Object.prototype.toString.call(x)=='[object Aray]'
短所:基準なし
 
PS:object属性方法に関する列挙
javascriptの中でobjectのtoString()、toLocal String()、valueOf()、hasOwnProperty()、isPrototypeOf()
propertyIs Enumerableは全部列挙できない内蔵方法です.for in文では、これらの方法の属性を巡回することはできません.