Обновить
2
0
Dmitry Soshnikov@dsCode

Пользователь

Отправить сообщение
Ну, тогда Вы профи, и, возможно, даже (скорей всего), доработали и соптимизировали сторонний скрипт, так, что он у вас летает во всех браузерах. В этом случае — да, почему бы не использовать эти скрипты, если Вы полностью за них в ответе и сможете по изменившейся ситуации сделать нужную коррекцию.
> Зачем нужно делать это самостоятельно, если можно взять нормальное готовое?

А если что-то сломается? Сможете адекватно разобраться в скрипте, расширить его, подкорректировать под меняющиеся нужды, расширить и т.д.?
Хотя, там небольшие заморочки (arguments отсеивается в Опере сразу). Определённо, хорошее решение.
А, нет :( Зависит от реализаций. Поэтому — снова — 100% не получится утверждать.
> Т.е. проверку внутреннюю проверку пройдут массивы и объекты типа «arguments». Но внутренняя проверка (с instanceof) отсеет arguments.

Блин, каша какая-то из опечаток получилась.

Т.е. внутреннюю проверку (на уровне реализации) пройдут массивы и объекты типа «arguments». Но проверка в JS (с instanceof) отсеет arguments.
Единственное, что можно соптимизировать, конечно — создавать функцию проверки не каждый раз, а единожды, и вызывать argeuments.callee.testFn, например.
А, чёрт! Конечно, массив, пардон, не доглядел (сказалось, что ночь уже была и спать охота было). Кстати, очень интересное решение. Поскольку .apply делает проверку аргумента на уровне реализации (например, в Spider Monkey):

if (!js_IsArrayLike(cx, aobj, &arraylike, &length))
    return JS_FALSE;

В свою очередь, функция js_IsArrayLike делает следующую проверку:

clasp = OBJ_GET_CLASS(cx, obj);
*answerp = (clasp == &js_ArgumentsClass || clasp == &js_ArrayClass);
if (!*answerp) {
    *lengthp = 0;
    return JS_TRUE;
}
return js_GetLengthProperty(cx, obj, lengthp);

Т.е. проверку внутреннюю проверку пройдут массивы и объекты типа «arguments». Но внутренняя проверка (с instanceof) отсеет arguments. Только, если не задать прототип arguments массивом:

function c() {
  var data = arguments;
  alert(isArray(data)); // false
  data.__proto__ = [];
  alert(isArray(data)); // true
}

Но в целом, эта проверка весьма действенна. +1
> Что там общего?

Много чего. Что конкретно интересует? Для начала можно это посмотреть — javascript.ru/forum/misc/2740-klassicheskijj-oop-v-javascript-2.html#post12189
> ну всё правильно =) ты ж передаёшь массив…

ой, ну здрасте! массив =) Еще раз — туда же, куда и instanceof относится — анализируется цепь прототипов.

isArray(new Number(1).__proto__ = []); — и это массив, ага :) Это «мутанты». Ы )
isArray({}.__proto__ = []);
> что-то

м? ;)
> А я говорю…

Да пожалуйста, кто мешает? :D

> 99%

Смотря что за литература. Может быть и 100%. А может и 34%.

> Естественно я не против изучения стандарта, но считаю что это время практически всегда можно будет потратить с большей пользой

Я не против, Вы сами решаете.

Но, в любом случае, стандарт — не «кирпич» ;)
> ну, если

да кабы ;)

Я и говорю, если нет «сильных» мутаций, то и простая проверка .constructor'a может подойти.
> из-за непривычности прототипного программирования

Сравните его с классовой моделью в Pyhton'e (или Ruby); увидите много общего.
> instanceof

тоже ненадёжно; instanceof работает с цепью прототипов, можно создать «мутацию», когда и «число» будет «массивом».
> 2 из 5?

Оу, пардон! Ни в коем разе это была не градация, всего лишь перечисление (причём, некоторые можно поменять местами). Цифры (от 2 до 5) просто совпали.

> Попробуйте человеку, который не знает JS, дать почитать ECMA-262. Сможет ли он после этого сразу пойти работать каким-нибудь js-программером? Однозначно нет. А если дать упомянутую мной книгу — вполне.

Да нет, это Вы подменяете понятия. Я не говорю, что новичку нужно садиться и изучать только лишь стандарт и идти сразу работать после этого. Стандарт — будет следующей стадией на пути к глубокому изучению технологии, но никак не «кирпичом».
Угу, спасибо за инфу (все комменты, правда, не дочитал). Интересная реализация. Заодно посмотрел релизацию .concat'а (в Spider Monkey) и как там эта проверка сделана:

if (aobj && OBJ_GET_CLASS(cx, aobj) == &js_ArrayClass) {
… и т.д.
}
По-моему, Вы противопоставляли стандарт (aka «кирпич» ;)), который «ничего не даст» и книги, где «очень успешное сочетание практики и теории». Никто не говорит, что книги читать не нужно, нужно просто правильно (относительно притязаний и текущего уровня — «так себе», «неплохо» (у Вас, как Вы отметили), «высокий», «профессионально», «академический» и т.д. (под последние три — подойдёт стандарт)) выбирать.
Да, «со 100% гарантией — никак», поскольку обе сущности — нативные объекты. Но, если сильных «мутаций» не происходило, то можно проверять свойство .constructor; также, массивы имеют {DontEnum}-свойство .length, которое изменяется автоматически при работе методов массива и добавлении свойств, имена которых являются правильными индексами массива (числа, приводимые к строке). Хотя, можно устроить ситуацию, когда любой объект будет иметь в прототипе свойство .constructor === Array, и свойство length.
> я это имел ввиду

да я понимаю, просто уточняю, чтобы не было путаницы, потому что фраза «это одно и тоже» здесь не подходит:

var a = new Number(10);
a.b = 20; // ok

var c = 10;
c.b = 20; // error

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность