Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Обсуждений тред (https://javascript.ru/forum/offtopic/47364-obsuzhdenijj-tred.html)

nerv_ 31.03.2015 19:58

Цитата:

Сообщение от МаксимкаНевозбанный
вот самый крутой способ и самый быстрый

тесты проходит :) (дописал первую строчку)
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

nerv_, а я вот думал на счет стринга но почему то оставил его, посмотрев на ангуляр, хотя нет в нем смысла

nerv_, ух ты, даже likeArray(document.createTextNode('выыв')) выдает false

поставлю себе в юишку эту функцию ка я)

nerv_ 31.03.2015 20:31

Цитата:

Сообщение от МаксимкаНевозбанный
а я вот думал на счет стринга но почему то оставил его, посмотрев на ангуляр, хотя нет в нем смысла

я пока 50/50 расцениваю. Не определился еще. Хотя, если мы проверяем на "массиво-подобные объекты", строка не объект, т.ч false.

Немного сократил. На последнем тесте врет.
С этими не знаю как правильно.

МаксимкаНевозбанный 31.03.2015 20:46

вообще likeArray предполагается что должна использоваться внутри toArray который по сути строку должен оборачивать в ['строка']

function toArray(item){
  if( likeArray(item) ) return [].slice.call(item);
  return [item]
}


так что строка не должна быть liteArray по уму чтобы можно было делать так


eventNames = toArray(eventsNames)

и если был массив строк то он и останется а если была строка то обернется в массив в котором будет в первой ячейке

kobezzza 31.03.2015 21:36

Цитата:

Сообщение от Zend (Сообщение 364176)
Safort,
Это называется - пилить сук на котором сидишь. Ни разу не видел где бы такой приём понадобился.

Ты просто не сталкивался, но это очень частый кейз.

***

По поводу likeArray, то у меня юзается так:
https://github.com/kobezzza/Collecti.../types.js#L134

Надо пожалуй добавить проверку для window.

nerv_ 31.03.2015 22:31

Цитата:

Сообщение от kobezzza
По поводу likeArray, то у меня юзается так:
https://github.com/kobezzza/Collecti.../types.js#L134

спасибо

Ты в курсе, что все подобные проверки идут лесом ибо
Цитата:

Не друзья: instanceof и фреймы
Оператор instanceof не срабатывает, когда значение приходит из другого окна или фрейма.

Например, массив, который создан в ифрейме и передан родительскому окну — будет массивом в том ифрейме, но не в родительском окне. Проверка instanceof Array в родительском окне вернёт false.

Вообще, у каждого окна и фрейма — своя иерархия объектов и свой window .

Как правило, эта проблема возникает со встроенными объектами, в этом случае используется проверка внутреннего свойства [[Class]]. Более подробно это описано в главе Оператор typeof, [[Class]] и утиная типизация.
http://learn.javascript.ru/instanceof

А еще зачем это, если есть старая добрая утиная типизация?) Т.е. эту функцию можно сократить.

Впрочем, это поверхностное суждение, я не знаю как у тебя там все устроено)

kobezzza 31.03.2015 22:43

Цитата:

Ты в курсе, что все подобные проверки идут лесом ибо
Конечно, но видимо просто забыл :) Спасибо, я напишу тесты.

Цитата:

А еще зачем это, если есть старая добрая утиная типизация?) Т.е. эту функцию можно сократить.

Впрочем, это поверхностное суждение, я не знаю как у тебя там все устроено)
Если честно, то я уже не помню, т.к. писал давно, но помню, что так зачем то надо было. Просто со временем всплывают баги - ты их прибиваешь и спокойно забываешь, а потом смотришь и думаешь - нах я это писал ? :D

Я планировал вернуться к разработке новой версии Collection вскорем, проведу ревью кода, но думаю, что здесь так надо было.

trikadin 31.03.2015 23:22

Цитата:

Сообщение от kobezzza
Просто со временем всплывают баги - ты их прибиваешь и спокойно забываешь

Хороший код сам себя комментирует :D

kobezzza 31.03.2015 23:25

Цитата:

Сообщение от trikadin (Сообщение 364299)
Хороший код сам себя комментирует :D

:D

Gozar 01.04.2015 00:12

Цитата:

Сообщение от trikadin
Хороший код

Хороший код, это код с комментариями в узких местах. ;)


Часовой пояс GMT +3, время: 21:56.