Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Проверка на массив


Автор: animegirl 5.12.2012, 04:42
Какой самый верный способ проверки данных на принадлежность к массиву, в гугле много разных вариантов, но большинство из них мне либо не понятны, либо работают в разных браузерах по разному :(
Есть какой-нибудь универсальный метод?

Автор: ksnk 5.12.2012, 05:58
http://stackoverflow.com/questions/784012/javascript-equivalent-of-phps-in-array
?

Автор: animegirl 5.12.2012, 06:12
ksnk, 
1. это скорее is_array() чем in_array()
2. Нельзя использовать посторонние библиотеки

Автор: ksnk 5.12.2012, 06:57
Код

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

Что в этом примере использует сторонние библиотеки? В каком месте этого примера это is_array, а не in_array?  smile 

Автор: animegirl 5.12.2012, 07:00
Вы не поняли, МНЕ нужен is_array()

Автор: ksnk 5.12.2012, 07:22
Код

var y = [];

if(y instanceof Array){
  alert("массив");
} else {
  alert("не массив");
}

Автор: Aliance 5.12.2012, 14:17
ksnk, не очень хорошее решение, как мне кажется (http://shamansir.github.com/JavaScript-Garden/#types.instanceof).

Соответственно я бы предложил следующий вариант:
Код

function isArray(obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === 'Array';
}

Автор: CruorVult 5.12.2012, 14:37
Код

isArray = ('isArray' in Array) ? Array.isArray : function(value) {
    return toString.call(value) === '[object Array]';
}

Автор: ksnk 5.12.2012, 14:46
Aliance,  instanceof всего лишь бежит по цепочке прототипов. 
Ваш метод определения объектов точно так же не будет работать в примере их той статьи  smile. Вообще пример идиотский, учитывая свободу работы  с прототипами.
Цитата

...(например, из различных документов в web-браузере), так как их конструкторы и правда не будут конструкторами тех самых объектов.

Смею предположить, что объект Array будет один и тот же даже для объектов из разных документов в одном броузере.

Автор: Amphiluke 5.12.2012, 15:31
Цитата(ksnk @  5.12.2012,  18:46 Найти цитируемый пост)
Смею предположить, что объект Array будет один и тот же даже для объектов из разных документов в одном броузере.


Можно проверить
Код

var ifr = $("<iframe src='about:blank'></iframe>").appendTo("body"),
    ifrWnd = ifr.contents()[0].defaultView;
alert(ifrWnd.Array === self.Array); // false
alert(ifrWnd.Object.prototype.toString.call(new ifrWnd.Array()) ===
    self.Object.prototype.toString.call(new self.Array())); // true

Автор: skyboy 5.12.2012, 15:59
Цитата(Aliance @  5.12.2012,  13:17 Найти цитируемый пост)
ksnk, не очень хорошее решение, как мне кажется (объяснение).

в данном случае, у нас не с примитивами работа(да и то, new Object(someVariable) instanceof Number сработало б).
arg instanceof Array вполне себе работает, как и [] instanceof Array

Автор: Aliance 5.12.2012, 17:00
Цитата(skyboy @  5.12.2012,  16:59 Найти цитируемый пост)
в данном случае, ... instanceof ... вполне себе работает

я этого и не отрицал

Автор: skyboy 5.12.2012, 19:51
Цитата(Aliance @  5.12.2012,  16:00 Найти цитируемый пост)
я этого и не отрицал

что тогда означает:
Цитата(Aliance @  5.12.2012,  13:17 Найти цитируемый пост)
ksnk, не очень хорошее решение, как мне кажется (объяснение).

?

Автор: animegirl 5.12.2012, 21:40
instanceof вариант работает хорошо, но вашу полемику читать интересно, узнаю много нового )

Автор: Aliance 6.12.2012, 10:17
Цитата(skyboy @  5.12.2012,  20:51 Найти цитируемый пост)
что тогда означает

означает, что не смотря на то, что в данной конкретной ситуации и этот поход работать будет, я бы советовал сразу использовать "более правильный". Аргументацию я привел, дальше выбор за топикстартером  smile 

Автор: JAYBE 10.12.2012, 17:00
А как же ещё один из верных способов?
Код

(function() {
var f = [];
console.log(f.constructor.name);
})()

Автор: Aliance 10.12.2012, 18:06
Опять-таки, в данном примере сработает, но в случае сложного прототипирования могут быть казусы.
Код

function Iterrator() { }
//Iterrator.prototype = { value: 'ololo' };
var iterrator = new Iterrator();
alert( iterrator.constructor == Iterrator);


Запустите скрипт дважды, во второй раз раскомментируйте строчку №2.

Автор: Amphiluke 10.12.2012, 18:48
Цитата(JAYBE @  10.12.2012,  21:00 Найти цитируемый пост)
А как же ещё один из верных способов?

Нестандартное свойство name в IE вообще не определено в Function.prototype

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)