Ну, тогда Вы профи, и, возможно, даже (скорей всего), доработали и соптимизировали сторонний скрипт, так, что он у вас летает во всех браузерах. В этом случае — да, почему бы не использовать эти скрипты, если Вы полностью за них в ответе и сможете по изменившейся ситуации сделать нужную коррекцию.
Единственное, что можно соптимизировать, конечно — создавать функцию проверки не каждый раз, а единожды, и вызывать argeuments.callee.testFn, например.
А, чёрт! Конечно, массив, пардон, не доглядел (сказалось, что ночь уже была и спать охота было). Кстати, очень интересное решение. Поскольку .apply делает проверку аргумента на уровне реализации (например, в Spider Monkey):
if (!js_IsArrayLike(cx, aobj, &arraylike, &length))
return JS_FALSE;
В свою очередь, функция js_IsArrayLike делает следующую проверку:
Т.е. проверку внутреннюю проверку пройдут массивы и объекты типа «arguments». Но внутренняя проверка (с instanceof) отсеет arguments. Только, если не задать прототип arguments массивом:
function c() {
var data = arguments;
alert(isArray(data)); // false
data.__proto__ = [];
alert(isArray(data)); // true
}
Оу, пардон! Ни в коем разе это была не градация, всего лишь перечисление (причём, некоторые можно поменять местами). Цифры (от 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.
А если что-то сломается? Сможете адекватно разобраться в скрипте, расширить его, подкорректировать под меняющиеся нужды, расширить и т.д.?
Блин, каша какая-то из опечаток получилась.
Т.е. внутреннюю проверку (на уровне реализации) пройдут массивы и объекты типа «arguments». Но проверка в JS (с instanceof) отсеет arguments.
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__ = []); — и это массив, ага :) Это «мутанты». Ы )
м? ;)
Да пожалуйста, кто мешает? :D
> 99%
Смотря что за литература. Может быть и 100%. А может и 34%.
> Естественно я не против изучения стандарта, но считаю что это время практически всегда можно будет потратить с большей пользой
Я не против, Вы сами решаете.
Но, в любом случае, стандарт — не «кирпич» ;)
да кабы ;)
Я и говорю, если нет «сильных» мутаций, то и простая проверка .constructor'a может подойти.
Сравните его с классовой моделью в Pyhton'e (или Ruby); увидите много общего.
тоже ненадёжно; instanceof работает с цепью прототипов, можно создать «мутацию», когда и «число» будет «массивом».
Оу, пардон! Ни в коем разе это была не градация, всего лишь перечисление (причём, некоторые можно поменять местами). Цифры (от 2 до 5) просто совпали.
> Попробуйте человеку, который не знает JS, дать почитать ECMA-262. Сможет ли он после этого сразу пойти работать каким-нибудь js-программером? Однозначно нет. А если дать упомянутую мной книгу — вполне.
Да нет, это Вы подменяете понятия. Я не говорю, что новичку нужно садиться и изучать только лишь стандарт и идти сразу работать после этого. Стандарт — будет следующей стадией на пути к глубокому изучению технологии, но никак не «кирпичом».
да я понимаю, просто уточняю, чтобы не было путаницы, потому что фраза «это одно и тоже» здесь не подходит: