typeof []
が'object'
を返すため、引数が配列かどうかを検出する方法と、配列とオブジェクトを区別したいのですが。
オブジェクトは{"0":"string","1":"string","length":"2"}
のように見える可能性がありますが、実際に配列のように見えるオブジェクトである場合、配列として出力されないようにします。
JSON.parse
とJSON.stringify
は、この区別をすることができます。どうすればいいですか?
Chromeと同じV8ベースのNode.JSを使用しています。
Array.isArray
ネイティブV8関数。それは速く、常に正しいです。これはES5の一部です。
arr instanceof Array
オブジェクトが配列コンストラクターで作成されたかどうかを確認します。
アンダースコアからのメソッド。ここに彼らのソースから取られたスニペットがあります
var toString = Object.prototype.toString,
nativeIsArray = Array.isArray;
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
このメソッドはオブジェクトを受け取り、Object.prototype.toString
メソッドを呼び出します。これは、配列に対して常に[object Array]
を返します。
私の個人的な経験では、toString
メソッドに問い合わせるのが最も効果的ですが、instanceof Array
ほど短くも読みにくいし、Array.isArray
ほど速くもありませんが、それはES5コードです。移植性のために使用しないようにします。
個人的には underscore
を使用することをお勧めします。これは、一般的なユーティリティメソッドを含むライブラリです。 DRYコードをアップする便利な関数がたくさんあります。
このコードを試してください:
Array.isArray(argument)
この質問にはいくつかの良い答えがあるようですが、完全を期すために、別のオプションを追加します。
何かが配列かどうかを確認するには、Node.js util
ネイティブモジュールとそのisArray()
関数を使用できます。
例:
var util = require('util');
util.isArray([]); // true
util.isArray(new Array); // true
util.isArray({"0":"string","1":"string","length":"2"}); // false
この方法では、常に正しい答えが表示されるため、V8で実装されているJS標準について心配する必要はありません。
どうですか:
your_object instanceof Array
V8ではChromeが得られます
[] instanceof Array
> true
({}) instanceof Array
> false
({"0":"string","1":"string","length":"2"}) instanceof Array
> false
この方法を試してください:
console.log(Object.prototype.toString.call(arg).replace(/ ^ [object(。+)] $ /、 '$ 1')。toLowerCase())