JavaScriptはある対象がObjectかそれともArayかを判断します.
2514 ワード
1.typeofオペレータ.Function,String,Number,Unidefinedなどのいくつかのタイプのオブジェクトにとっては完全に適任ですが、Arayの場合は
2.instance ofオペレータは、JavaScriptのinstance of演算子がBoolean値を返し、対象が特定のクラスの一例であるかどうかを指摘する.
使い方:result=object instance of classは、まだ先の配列です.もう一回来てください.うん、みごとにtrueに戻ります.
コード
ECMA-622書き込み
Object.prototype.toString()When the to String method is caled,the following steps are taken:
1.Get the[Class]property of this oject.
2.Compute a string value by concatentating the three streings「Object」、Result(1)、and「.」
3.Return Result(2)
上記の仕様はObject.prototype.toStringの挙動を定義しています.まず、対象の内部属性を取得し、この属性に基づいて、「Object Aray」と似た文字列を返します.結果として(ECMA規格を見ても分かるはずです.[]は言語内部で使用される、外部から直接アクセスできない属性を表します.「内部属性」といいます.)この方法を利用して、コールに合わせて、どのオブジェクトの内部属性も取得できます.そして、タイプ検出を文字列に変換して、目的を達成します.まずはECMA規格でのアラーの説明を見てみましょう.
ECMA-622書き込み
new Aray([item 0[,item 1]])
The[[Class]]property of the newly construct object is set to“Aray”.
これを利用して、第三の方法が登場しました.
function isAray(obj){
return Object.prototype.toString.call(obj)=='[object Aray]'
}callがtoStringのthisを検出対象として参照し、このオブジェクトの文字列表現を返して、この文字列が'object Aray'であるかどうかを比較して、Arayの例であるかを判断します.なぜ直接o.toString()でないかを聞きたいです.?えっと、ArayはObjectから引き継ぎますが、tostring方法もありますが、この方法は書き換えられて私達の要求に達しないかもしれません.Object.prototypeは虎のお尻です.触る人が少ないので、ある程度「純潔さ」を保証できます.
前のいくつかの案と違って、この方法はframeオブジェクトにまたがって構築された問題をよく解決しました.テストを経て、各ブラウザの互換性もとても良く、安心して使えます.良いニュースは、jQuery、Base 2など、この方法を参考にして、配列、正規表現などのオブジェクトのタイプ判定を実現する予定です.私達はいらないです.自分で書きました
また、Ext 3もすでにこのような書き方に変えました.
var arr=new Array("1","2","3","4","5");
alert(typeof(arr));
あなたはobjectの答えを受け取ることができて、少し人を失望させます.2.instance ofオペレータは、JavaScriptのinstance of演算子がBoolean値を返し、対象が特定のクラスの一例であるかどうかを指摘する.
使い方:result=object instance of classは、まだ先の配列です.もう一回来てください.うん、みごとにtrueに戻ります.
var arrayStr=new Array("1","2","3","4","5");
alert(arrayStr instanceof Array);
まとめ:今日の討論の問題はすでに解答を得たようですが、実は多くのframeの中を行ったり来たりすると大きな問題が発生します.コード
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray("1","2","3","4","5");// IE ,FF
alert(arr instanceof Array); // false
alert(arr.constructor === Array); // false
結果は2つのFalseで、がっかりさせられました.ECMA-622書き込み
Object.prototype.toString()When the to String method is caled,the following steps are taken:
1.Get the[Class]property of this oject.
2.Compute a string value by concatentating the three streings「Object」、Result(1)、and「.」
3.Return Result(2)
上記の仕様はObject.prototype.toStringの挙動を定義しています.まず、対象の内部属性を取得し、この属性に基づいて、「Object Aray」と似た文字列を返します.結果として(ECMA規格を見ても分かるはずです.[]は言語内部で使用される、外部から直接アクセスできない属性を表します.「内部属性」といいます.)この方法を利用して、コールに合わせて、どのオブジェクトの内部属性も取得できます.そして、タイプ検出を文字列に変換して、目的を達成します.まずはECMA規格でのアラーの説明を見てみましょう.
ECMA-622書き込み
new Aray([item 0[,item 1]])
The[[Class]]property of the newly construct object is set to“Aray”.
これを利用して、第三の方法が登場しました.
function isAray(obj){
return Object.prototype.toString.call(obj)=='[object Aray]'
}callがtoStringのthisを検出対象として参照し、このオブジェクトの文字列表現を返して、この文字列が'object Aray'であるかどうかを比較して、Arayの例であるかを判断します.なぜ直接o.toString()でないかを聞きたいです.?えっと、ArayはObjectから引き継ぎますが、tostring方法もありますが、この方法は書き換えられて私達の要求に達しないかもしれません.Object.prototypeは虎のお尻です.触る人が少ないので、ある程度「純潔さ」を保証できます.
前のいくつかの案と違って、この方法はframeオブジェクトにまたがって構築された問題をよく解決しました.テストを経て、各ブラウザの互換性もとても良く、安心して使えます.良いニュースは、jQuery、Base 2など、この方法を参考にして、配列、正規表現などのオブジェクトのタイプ判定を実現する予定です.私達はいらないです.自分で書きました
また、Ext 3もすでにこのような書き方に変えました.
isArray : function(v){
return toString.apply(v) === '[object Array]';
}