<p>вы также можете использовать:</p><pre><code>if (value instanceof array) { alert('value is array!'); } else { alert('not an array'); } </code></pre><p>это кажется мне довольно элегантным решением, но каждому свое.</p><p>правка:</p><p>что касается es5, то теперь также есть:</p><pre><code>array.isarray(value); </code></pre><p>но это сломается в старых браузерах, если вы не используете полифилы (в основном ... ie8 или аналогичные).</p>

<p>есть несколько решений со всеми их причудами. <a href="http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/">эта страница</a> дает хороший обзор. одним из возможных решений является:</p><pre><code>function isarray(o) { return object.prototype.tostring.call(o) === '[object array]'; } </code></pre>

<p>я заметил, что кто-то упомянул jquery, но я не знал, что существует функция <a href="http://api.jquery.com/jquery.isarray/"><code>isarray()</code></a> . оказывается, это было добавлено в версии 1.3.</p><p>jquery реализует это так, как предлагает питер:</p><pre><code>isarray: function( obj ) { return tostring.call(obj) === "[object array]"; }, </code></pre><p>уже поверив в jquery (особенно в их методы кросс-браузерной совместимости), я либо обновлюсь до версии 1.3 и буду использовать их функцию (при условии, что обновление не вызовет слишком много проблем), либо использую этот предложенный метод непосредственно в моем код.</p><p>большое спасибо за предложения.</p>

<p>это старый вопрос, но с той же проблемой я нашел очень элегантное решение, которым хочу поделиться.</p><p>добавление прототипа в массив делает его очень простым</p><pre><code>array.prototype.isarray = true; </code></pre><p>теперь, если у вас есть объект, который вы хотите проверить, чтобы увидеть, является ли он массивом, все, что вам нужно, это проверить новое свойство</p><pre><code>var box = dosomething(); if (box.isarray) { // do something } </code></pre><p>isarray доступен только если его массив</p>

<p>когда я отправил этот вопрос, версия jquery, которую я использовал, не включала функцию <code>isarray</code>. если бы он был, я бы, вероятно, просто использовал его, полагая, что реализация - лучший независимый от браузера способ выполнить эту конкретную проверку типа.</p><p>поскольку jquery теперь предлагает эту функцию, я бы всегда использовал ее ...</p><pre><code>$.isarray(obj); </code></pre><p>(начиная с версии 1.6.2) он по-прежнему реализован с использованием сравнений строк в форме</p><pre><code>tostring.call(obj) === "[object array]" </code></pre>

<p>если вы имеете дело только с ecmascript 5 и выше, тогда вы можете использовать встроенную функцию <code>array.isarray</code></p><p>например.,</p><pre><code>array.isarray([]) // true array.isarray("foo") // false array.isarray({}) // false </code></pre>

<p>думаю, я бы добавил еще один вариант для тех, кто уже использует библиотеку underscore.js в своем скрипте. underscore.js имеет функцию isarray () (см. <a href="http://underscorejs.org/#isarray">http://underscorejs.org/#isarray</a> ).</p><pre><code>\_.isarray(object) </code></pre><blockquote> <p>возвращает true, если объект является массивом.</p> </blockquote>

<p>если вы используете angular, вы можете использовать функцию angular.isarray ()</p><pre><code>var myarray = []; angular.isarray(myarray); // returns true var myobj = {}; angular.isarray(myobj); //returns false </code></pre><p> <a href="http://docs.angularjs.org/api/ng/function/angular.isarray">http://docs.angularjs.org/api/ng/function/angular.isarray</a> </p>

<p>я использовал эту строку кода:</p><pre><code>if (variable.push) { // variable is array, since amaik only arrays have push() method. } </code></pre>

<p>код ссылается с <a href="https://github.com/miksago/evan.js/blob/master/src/evan.js">https://github.com/miksago/evan.js/blob/master/src/evan.js</a> </p><pre><code> var isarray = array.isarray || function(obj) { return !!(obj && obj.concat && obj.unshift && !obj.callee);}; </code></pre>

<p>для тех, кто код-гольф, ненадежный тест с наименьшим количеством персонажей:</p><pre><code>function isarray(a) { return a.map; } </code></pre><p>это обычно используется при обходе/выравнивании иерархии:</p><pre><code>function golf(a) { return a.map?[].concat.apply([],a.map(golf)):a; } input: [1,2,[3,4,[5],6],[7,[8,[9]]]] output: [1, 2, 3, 4, 5, 6, 7, 8, 9] </code></pre>

<p>от <a href="http://www.w3schools.com/js/js\_arrays.asp">w3schools</a> :</p><pre><code>function isarray(myarray) { return myarray.constructor.tostring().indexof("array") > -1; } </code></pre>

<p>мне понравился ответ брайана:</p><pre><code>function is\_array(o){ // make sure an array has a class attribute of [object array] var check\_class = object.prototype.tostring.call([]); if(check\_class === '[object array]') { // test passed, now check return object.prototype.tostring.call(o) === '[object array]'; } else{ // may want to change return value to something more desirable return -1; } } </code></pre><p>но вы могли бы просто так:</p><pre><code>return object.prototype.tostring.call(o) === object.prototype.tostring.call([]); </code></pre>

<p>я думаю, использование myobj.constructor == object и myarray.constructor == array - лучший способ. это почти в 20 раз быстрее, чем при использовании tostring (). если вы расширяете объекты с помощью своих собственных конструкторов и хотите, чтобы эти создания также считались "объектами", это не сработает, но в противном случае это будет быстрее. typeof работает так же быстро, как и метод конструктора, но typeof [] == 'object' возвращает true, что часто нежелательно. <a href="http://jsperf.com/constructor-vs-tostring">http://jsperf.com/constructor-vs-tostring</a> </p><p>следует отметить, что null.constructor выдаст ошибку, поэтому, если вы, возможно, проверяете наличие нулевых значений, вам сначала нужно будет выполнить if (testthing! == null) {}</p>