

JavaScriptで変数に入っている値が文字列か文字列の配列かによって処理を分けたいです。  
厳密に配列の中身が文字列であるかどうかまではチェックしなくて良いです。

[code]

    var stringOrArray = someFunc();
    
    if (argumentIsString(stringOrArray)) {
      // 文字列が渡された時の処理
    
    } else if (argumentIsArray(stringOrArray)) {
      // 配列が渡された時の処理
    
    }
    
[/code]

上記`argumentIsString`, `argumentIsArray`にあたる処理はどのようになりますか？  
どちらか片方がわかればもう片方は `else` でも良いですが、できれば今後の変更を見据えて文字列・配列それぞれの判定をしたいです。

ちなみにIE8以上の対応が必要です。


CC BY-SA 3.0
2015-03-03T07:46:47.997
7365
2015-03-04T01:13:36.623
450
question
javascript
StringかArrayかを判定したい


こちらが参考になると思います。  
[JavaScript Garden](http://bonsaiden.github.io/JavaScript-
Garden/#types.typeof)  
[日本語訳](http://bonsaiden.github.io/JavaScript-Garden/ja/#types.typeof)

[code]

    function is(type, obj) {
        var clas = Object.prototype.toString.call(obj).slice(8, -1);
        return obj !== undefined && obj !== null && clas === type;
    }
    
    is('String', 'test'); // true
    is('String', new String('test')); // true
    
[/code]


CC BY-SA 3.0
2015-03-03T08:00:05.240
7367
2015-03-03T08:00:05.240
7926
7365
answer


本家に同様の質問がありました  
<https://stackoverflow.com/questions/1058427/how-to-detect-if-a-variable-is-
an-array>

`Array.isArray`ってIE8で使えるのかな。。。？


CC BY-SA 3.0
2015-03-03T08:01:15.853
7368
2015-03-03T08:01:15.853
2017-05-23T12:38:55.307
-1
845
7365
answer


あんまり汎用性はありませんが、  
お手軽にするならこうでしょうか？

[code]

    var stringOrArray = someFunc();
    
    if (typeof(stringOrArray) == "string" || stringOrArray instanceof String) {
      // 文字列が渡された時の処理
    } else if (stringOrArray instanceof Array) {
      // 配列が渡された時の処理
    }
    
[/code]

[追記]

既に他の回答のコメントで言及されていますが、  
ArrayやStringそのものを上書きされてしまった場合、この方法は破綻します。  
方法は極めて単純で、判定前に

[code]

    /* fooやbarの中身は適当 */
    String = foo
    Array = bar
    
[/code]

と書かれた場合はアウトとなります。


CC BY-SA 3.0
2015-03-03T08:06:20.477
7369
2015-03-04T01:13:36.623
2015-03-04T01:13:36.623
70
70
7365
answer


ちょっと変わった方向として [underscore.js
のソース](https://github.com/jashkenas/underscore/blob/044ba5c3502dfac26c1a863a62c518b91e2a255d/underscore.js#L1210-L1215)
を見ると、`Object.prototype.toString.call(v)` して、返ってきた文字列を比較してますね。

[code]

    Object.prototype.toString.call(obj) === '[object Array]'
    
    Object.prototype.toString.call(obj) === '[object String]'
    
[/code]

# なんでこうするんだろ… `instanceof` だけで十分に思うけれども


CC BY-SA 3.0
2015-03-03T16:16:27.737
7393
2015-03-03T16:16:27.737
208
7365
answer