31.03.2015, 19:58
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от МаксимкаНевозбанный
|
вот самый крутой способ и самый быстрый
|
тесты проходит (дописал первую строчку)
var array = [1];
var arrayLike = {0:1, length:1};
var fakeArrayLike = {length:1, height:2};
var window = window;
var fn = function() {};
var fake1 = {foo: NaN, length: 1};
var fake2 = {'12.24': 1, length: 1};
var fake3 = '';
var fake4 = '1';
console.log(isArrayLike(document.getElementsByTagName('body')) === true, 1);
console.log(isArrayLike(document.querySelectorAll('body')) === true, 2);
console.log(isArrayLike(array) === true, 3);
console.log(isArrayLike(arrayLike) === true, 4);
console.log(isArrayLike(fakeArrayLike) === false, 5);
console.log(isArrayLike(window) === false, 6);
console.log(isArrayLike(fn) === false, 7);
console.log(isArrayLike(fake1) === false, 8);
console.log(isArrayLike(fake2) === false, 9);
console.log(isArrayLike(fake3) === false, 10);
console.log(isArrayLike(fake4) === false, 11);
function isArrayLike(item) {
if( typeof item === 'string' ) return false;
if( item == null ) return false;
if( item === window ) return false;
if( !('length' in item) ) return false;
if( typeof item === 'function' ) return false;
if( item.length === 0 ) return true;
return ( item.length - 1 ) in item
}
---
Erolast, не всегда есть возможность патчить)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
31.03.2015, 20:02
|
|
Новичок на форуме
|
|
Регистрация: 31.03.2015
Сообщений: 9
|
|
nerv_, а я вот думал на счет стринга но почему то оставил его, посмотрев на ангуляр, хотя нет в нем смысла
nerv_, ух ты, даже likeArray(document.createTextNode('выыв')) выдает false
поставлю себе в юишку эту функцию ка я)
|
|
31.03.2015, 20:31
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от МаксимкаНевозбанный
|
а я вот думал на счет стринга но почему то оставил его, посмотрев на ангуляр, хотя нет в нем смысла
|
я пока 50/50 расцениваю. Не определился еще. Хотя, если мы проверяем на "массиво-подобные объекты", строка не объект, т.ч false.
Немного сократил. На последнем тесте врет.
С этими не знаю как правильно.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
31.03.2015, 20:46
|
|
Новичок на форуме
|
|
Регистрация: 31.03.2015
Сообщений: 9
|
|
вообще likeArray предполагается что должна использоваться внутри toArray который по сути строку должен оборачивать в ['строка']
function toArray(item){
if( likeArray(item) ) return [].slice.call(item);
return [item]
}
так что строка не должна быть liteArray по уму чтобы можно было делать так
eventNames = toArray(eventsNames)
и если был массив строк то он и останется а если была строка то обернется в массив в котором будет в первой ячейке
Последний раз редактировалось МаксимкаНевозбанный, 31.03.2015 в 20:49.
|
|
31.03.2015, 21:36
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от Zend
|
Safort,
Это называется - пилить сук на котором сидишь. Ни разу не видел где бы такой приём понадобился.
|
Ты просто не сталкивался, но это очень частый кейз.
***
По поводу likeArray, то у меня юзается так:
https://github.com/kobezzza/Collecti.../types.js#L134
Надо пожалуй добавить проверку для window.
Последний раз редактировалось kobezzza, 31.03.2015 в 21:47.
|
|
31.03.2015, 22:31
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
спасибо
Ты в курсе, что все подобные проверки идут лесом ибо
Цитата:
|
Не друзья: instanceof и фреймы
Оператор instanceof не срабатывает, когда значение приходит из другого окна или фрейма.
Например, массив, который создан в ифрейме и передан родительскому окну — будет массивом в том ифрейме, но не в родительском окне. Проверка instanceof Array в родительском окне вернёт false.
Вообще, у каждого окна и фрейма — своя иерархия объектов и свой window .
Как правило, эта проблема возникает со встроенными объектами, в этом случае используется проверка внутреннего свойства [[Class]]. Более подробно это описано в главе Оператор typeof, [[Class]] и утиная типизация.
|
http://learn.javascript.ru/instanceof
А еще зачем это, если есть старая добрая утиная типизация?) Т.е. эту функцию можно сократить.
Впрочем, это поверхностное суждение, я не знаю как у тебя там все устроено)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
31.03.2015, 22:43
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Цитата:
|
Ты в курсе, что все подобные проверки идут лесом ибо
|
Конечно, но видимо просто забыл Спасибо, я напишу тесты.
Цитата:
|
А еще зачем это, если есть старая добрая утиная типизация?) Т.е. эту функцию можно сократить.
Впрочем, это поверхностное суждение, я не знаю как у тебя там все устроено)
|
Если честно, то я уже не помню, т.к. писал давно, но помню, что так зачем то надо было. Просто со временем всплывают баги - ты их прибиваешь и спокойно забываешь, а потом смотришь и думаешь - нах я это писал ?
Я планировал вернуться к разработке новой версии Collection вскорем, проведу ревью кода, но думаю, что здесь так надо было.
|
|
31.03.2015, 23:22
|
|
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Сообщение от kobezzza
|
Просто со временем всплывают баги - ты их прибиваешь и спокойно забываешь
|
Хороший код сам себя комментирует
|
|
01.04.2015, 00:12
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от trikadin
|
Хороший код
|
Хороший код, это код с комментариями в узких местах.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Последний раз редактировалось Gozar, 01.04.2015 в 00:14.
|
|
|
|