だから私は引数がオブジェクトかどうかをチェックする必要がある関数を持っていますが、これは次の理由で失敗します:
typeof [] // returns 'object'
これは古典的なjavascriptの問題ですが、配列ではなく実際にオブジェクトを受け入れるために何をすべきか思い出せません。
このようなものを試してください:
obj.constructor.toString().indexOf("Array") != -1
または(さらに良い)
obj instanceof Array
オブジェクトが "Array"クラスのインスタンス(つまり、 "Array"によって構築されたもの)であるかどうかを(何らかの方法で)確認することを提案するこれらすべての回答は、本当に安全な解決策ではありません。それらは時々、おそらくほとんどの場合は機能しますが、すべての主要なフレームワークはそのアプローチから離れています。これに関する主な問題の1つは、複数のウィンドウ(通常、親ウィンドウと1つ以上のフレームまたはiframeウィンドウ)の間に相互作用があるときに発生します。あるウィンドウで作成された配列オブジェクトを別のウィンドウに常駐するAPIに渡すと、これらのテストはすべて失敗します。どうして?テストしているのは、オブジェクトが "Array"クラスのインスタンスであるかどうかですローカルウィンドウコンテキスト内。つまり、「配列」を参照すると
if (myobject instanceof Array) { ... }
あなたが参照しているのはwindow.Array
、 もちろん。 別のウィンドウで構築された配列は、notがウィンドウのArrayクラスのインスタンスになることはありません!
コンストラクター名をチェックすることはおそらく少し安全ですが、それでも危険は伴います。私の意見では、アヒルのタイピングのアプローチを取る方が良いです。つまり、「これは配列ですか?」代わりに、「このオブジェクトは、この状況で必要な特定の一連の配列APIをサポートしているようですか?」たとえば、「このオブジェクトにはlength
プロパティがありますか?」 JavaScriptはかなり「ソフト」な言語であり、ほぼすべてが変更可能です。したがって、たとえ「配列」によって構築されたものを見つけたとしても、あなたはstillでそれに対して、またはそれに対して何ができるのか本当にわかりません。
[編集]そのリンクをありがとう、@ Lachlan-問題の非常に明確な説明があります: http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to- write-robust-type-checks /
特定のオブジェクトが配列であるかどうかを判断するために、ECMAScript 5は Array.isArray() メソッドを導入しています。これは、現在すべての最新のブラウザーでサポートされています。この ECMAScript互換性テーブル を参照してください。
特定のオブジェクトのクラスを判別するには、 Object.prototype.toString() メソッドを使用できます。
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"
何かがArrayのインスタンスであるかどうかをテストするには:
const arr = [1,2,3];
Array.isArray(arr); // true
テストは何かがObjectのインスタンスです:
const obj = { 1: 'a', 2: 'b', 3: 'c' };
obj.constructor === Object; // true
注後者の場合、obj
がnull
またはundefined
の場合、エラーがスローされます。あなたは使うことができます:typeof obj === 'object'
またはnullチェックを実行します:obj && obj.constructor === Object
。
配列は結局のところJavaScriptのオブジェクトなので、変数のタイプがオブジェクトであり、同時にこのオブジェクトがArrayクラスのインスタンスではないかどうかを確認するだけです。
var obj = {fname:'John',lname:'Doe'};
if(typeof obj === 'object' && !(obj instanceof Array)){
return true ;
} else {
return false;
}
価値があるのは、jQueryが配列かどうかをチェックする方法です。
isArray: function( arr ) {
return !!arr && arr.constructor == Array;
}
しかし、- この記事 は、次のようにすることをお勧めします。
function isArray(o) {
return Object.prototype.toString.call(o) === '[object Array]';
}
これを試しましたか:
var test = [];
if(test instanceof Array) {
...
}
[〜#〜] edit [〜#〜]:このメソッドは、マルチフレームDOM環境では機能しません( 'typeof'役に立たないと考えられている-または堅牢な型チェックの書き方 )。 (viaPointy)
Object.prototype.toString.call({}).slice(8,-1)==="Object"
を使用してください。これはすべてのデータ型で機能し、call関数内のパラメーターと比較を置き換えて、異なるデータ型をチェックすることもできます。 nullチェックにも機能します
_var obj = {first: 'Stack', last: 'Overflow'};
// var obj = ['Stack', 'overflow']; //You can uncomment this line and comment the above to check..
if(Object.prototype.toString.call(obj) !== '[object Array]') {
//your code..
var str = '';
for(var k in obj) {
str = str + obj[k] + ' ';
}
console.log('I love ', str);
alert('I love ' + str);
} else {
console.log('Could not process. Probably an array');
alert('Could not process. Probably an array');
}
console.log('Length is: ', Object.keys(obj).length);
alert('Length is: ' + Object.keys(obj).length);
_
input
をArray
またはObject
とする
オブジェクトがArray
かどうかを確認するにはif(Object.prototype.toString.call(input) === '[object Array]') {}
オブジェクトがObject
かどうかを確認するにはif(Object.prototype.toString.call(input) === '[object Object]') {}
Object.keys(input).length
は配列とオブジェクトの両方の長さを返すことに注意してください。
JS Fiddle例 同じ