毎日ほんの少し-EXTソースの分析の2
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :
この閉バッグに何が入っているのか見てみましょう.
isIterable = function(v){
//check for array or arguments
if(Ext.isArray(v) || v.callee){
return true;
}
//check for node list type
if(/NodeList|HTMLCollection/.test(toString.call(v))){
return true;
}
//NodeList has an item and length property
//IXMLDOMNodeList has nextNode method, needs to be checked first.
return ((v.nextNode || v.item) && Ext.isNumber(v.length));
},
この関数は,伝達されたパラメータが反復できるかどうかを判断するものであり,実は配列とクラス配列であるかどうかを判断するものである.
ここではjsが非常に興味深い点について、クラス配列です.
クラス配列とは?
クラス配列は配列のようなオブジェクトです.
jsがアヒルのタイプのように、私が理解しているクラス配列は、配列のように操作できる基礎を持っているかもしれませんが、配列やそのサブクラスではありません.
上記の注記のようにarguments,NodeList(node.clidenNodes戻り値)、HTML Collectionは比較的一般的なクラス配列である.
以下のコード(テストコード、EXTに関係なく)
(function test(){
f={
length:"f"
};
f=Array.prototype.slice.call(f);
alert(f instanceof Array);//true
})();
ネット上の多くの資料では、オブジェクトにlength属性があれば、以下の小さなテクニックでオブジェクトを本当の配列に変換することができ、callは本当に柔軟すぎると言われています.
Array.prototype.slice.call(f)
しかし、私の実験では、標準的な遊覧機ではlength属性は必要なく、オブジェクト(基本タイプではだめ)であれば配列に変えることができます.
IEではlength属性がなく、エラーが報告されます.
説明を求める.
EXTは配列を自分で変換する方法もあります.この関数は面白いです.すぐに実行し、遊覧機を判断し、閉パッケージに戻ります.
toArray : function(){
return isIE ?
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :
function(a, i, j){
return Array.prototype.slice.call(a, i || 0, j || a.length);
}
}(),
注目すべきは、DOMです.
IEとDOMを実現する方式は特殊で、COMモデルなので、残念ながら使えません.
Array.prototype.slice.call(a,i‖0,j‖a.length)はNodeListを配列に変換する.
だからIEに対してこの方式を採用します.
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :