Подтвердить что ты не робот

Как проверить, не является ли объект массивом?

Итак, у меня есть функция, которая должна проверять, является ли аргумент объектом, но это не удается, потому что:

typeof [] // returns 'object'

Это классический javascript gotcha, но я не могу вспомнить, что делать, чтобы фактически принимать объекты, но не массивы.

4b9b3361

Ответ 1

Попробуйте что-то вроде этого:

obj.constructor.toString().indexOf("Array") != -1

или (еще лучше)

obj instanceof Array

Ответ 2

Все эти ответы, предполагающие, что вы проверяете, чтобы увидеть (так или иначе), если объект является экземпляром класса "Array" (то есть, построенным "Array" ), действительно не являются безопасными решениями. Они будут работать иногда, может быть, большую часть времени, но все основные рамки ушли от этого подхода. Одна из основных проблем с ним возникает при взаимодействии нескольких окон (как правило, родительского окна и одного или нескольких окон фрейма или iframe). Если вы передадите объект массива, созданный в одном окне, в резидентный API в другом окне, все эти тесты потерпят неудачу. Зачем? Поскольку вы тестируете, является ли объект экземпляром класса "Array" в контексте вашего локального окна. Другими словами, когда вы ссылаетесь на "Массив" в

if (myobject instanceof Array) { ... }

то, что вы ссылаетесь, window.Array, конечно. Ну, массив, построенный в другом окне, будет not, который будет экземпляром класса Array в вашем окне!

Проверка имени конструктора, вероятно, немного безопаснее, хотя и по-прежнему опасна. По-моему, вам лучше взять подход к утиной печати. То есть вместо того, чтобы спрашивать: "Это массив?" спросите вместо этого: "Кажется, этот объект поддерживает определенный набор API-интерфейсов Array, которые мне нужны в этом случае?" Например, "имеет ли этот объект свойство length?" Javascript - довольно "мягкий" язык, и почти все изменчиво. Таким образом, даже если вы узнаете, что что-то было создано "Array", вы по-прежнему не знаете точно, что вы можете с ним сделать или с ним.

[edit] Спасибо за эту ссылку, @Lachlan - здесь очень четкое описание проблем: http://juhukinners.com/2009/01/11/typeof-considered-useless-or-how-to-write-robust-type-checks/

Ответ 3

Чтобы определить, является ли данный объект массивом, ECMAScript 5 вводит метод Array.isArray(), который в настоящее время поддерживается во всех современных браузеры. Обратитесь к этой таблице совместимости ECMAScript.

Чтобы определить класс конкретного объекта, вы можете использовать метод Object.prototype.toString().

Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[object Array]"

Ответ 4

Массивы - это объекты в javascript, поэтому все, что вам нужно сделать, это проверить, является ли тип переменной объектом, и в то же время этот объект не является экземпляром класса Array.

var obj = {fname:'John',lname:'Doe'};

if(typeof obj === 'object' && !(obj instanceof Array)){
  return true ;
} else  {
  return false;
}

Ответ 5

Чтобы проверить, является ли что-то экземпляром 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' или просто выполнить нулевую проверку: obj && obj.constructor === Object.

Ответ 6

Для чего стоит, вот как jQuery проверяет, что-то есть массив:

isArray: function( arr ) {
    return !!arr && arr.constructor == Array;
}

Но в этой статье рекомендует сделать это вот так:

function isArray(o) {
    return Object.prototype.toString.call(o) === '[object Array]';
}

Ответ 8

Посмотрите этот пакет

Убедитесь, что данный объект не является массивом для старых браузеров

https://www.npmjs.com/package/notisarray

Ответ 9

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);

Ответ 10

используйте Object.prototype.toString.call({}).slice(8,-1)==="Object", это работает для всех типов данных, которые вы можете заменить параметром внутри функции вызова и сравнения также для проверки разных типов данных. он также работает для нулевой проверки

Ответ 11

ты можешь пойти на

object instanceOf Object []