2011-02-09 5 views
14

jQueryで開発しているときに、自分がChrome/Firebugコンソールにセレクタを入力して、自分が何を私に与えるかをよく知ることがあります。彼らが配列であるかのように彼らは常にきれいにフォーマットされています。私はそれはそれは、コンソールが配列としてオブジェクトを扱う可能であるものをうまくしようとしていますFirebug/Chromeコンソールがカスタムオブジェクトを配列として扱う理由は何ですか?

Chrome's console shows a jQuery selection as an array

。例えば、次のカスタムオブジェクトが配列として扱われない:

function ElementWrapper(id) { 
    this[0] = document.getElementById(id); 
} 

Chrome's console shows the object as a normal object

I次いでlength性及びspliceメソッドを追加する場合、それは魔法の整数を持つ任意の特性を有する、アレイとして動作しますアレイのメンバーとして扱わキー:

function ElementWrapper(id) { 
    this[0] = document.getElementById(id); 
    this.length = 1; 
    this.splice = Array.prototype.splice; 
} 

Chrome's console shows the object as if it was an array

だから本質的に私の質問は:コンソールがオブジェクトを配列として表示するかどうかを決定するもの?その根拠がありますか、それとも完全に任意ですか?「オブジェクトにこれらのプロパティがある場合、配列でなければなりませんか?もしそうなら、決定的な特性は何ですか?

答えて

18

これは、FirebugののisArrayメソッドが何をするかです:もちろん(Firebug sourceから)

if (!obj) 
    return false; 
else if (isIE && !isFunction(obj) && typeof obj == "object" && isFinite(obj.length) && obj.nodeType != 8) 
    return true; 
else if (isFinite(obj.length) && isFunction(obj.splice)) 
    return true; 
else if (isFinite(obj.length) && isFunction(obj.callee)) // arguments 
    return true; 
else if (instanceOf(obj, "HTMLCollection")) 
    return true; 
else if (instanceOf(obj, "NodeList")) 
    return true; 
else 
    return false; 

、これらのチェックのいずれも、オブジェクトが真のJavaScript配列であるが、彼らがいるかどうかを推測するの合理的な仕事をすることを保証しませんオブジェクトは擬似配列で、デバッグのための便利な配列のような表現を提供します。

Chromeはこれらの同じチェックを使用する場合と使用しない場合があり、Firefox 4の新しいWebコンソールでは、真の配列以外のものを配列として認識しません。

+0

多くのありがとう - それは素晴らしい答えです! – lonesomeday

+0

したがって、jqueryの選択結果はどちらですか? – Aliostad

+0

@Aliostad '.length'と' .splice'は、私のOPに示されています。 – lonesomeday

関連する問題