JavaScript, типы, классы и функция-определялка

Набросал на скору руку функцию-определялку «расширенного типа» javascript-значения, как обещал в недавней статье.

Если у кого тесты завершаются с ошибками, не поленитесь, отпишитесь.

Функция возвращает следующий набор «типов»:

  • number (включая объекты, созданные через new Number())
  • string (включая объекты, созданные через new String())
  • boolean (включая объекты, созданные через new Boolean())
  • undefined
  • null
  • function (включая функции, созданные через new Function() и host-функции в IE)
  • array (включая экземпляры унаследованный «классов»)
  • regexp
  • error (экземпляры Error и производных)
  • date (объекты Date)
  • element (DOM-элементы)
  • textnode (текстовые узлы DOM)
  • collection (коллекции DOM-элементов)
  • arguments (объекты arguments функции)
  • object (всё остальное)

Также дополнил сводные таблицы по типам.

JavaScript, typeof и таблички

В прошлой статейке я обещал свести все десять экранов флуда в таблички.

Вот, пожалуйста: сводные таблички.

JavaScript, typeof, типы и классы.

Статья написана по мотивам бессмысленной и беспощадной дискуссии на javascript.ru.

Итак, есть у нас программа на языке JavaScript, в ней есть какие-то значения, а у значений есть какой-то тип. И вот вопрос: как нам узнать, этот самый тип значения?

И второй вопрос: а действительно ли нам надо его узнавать и нельзя ли обойтись другими средствами?

Под «типом» я здесь подразумеваю более широкое понятие, чем встроенный тип, возвращаемый оператором typeof. Это, например, «массив» или «элемент DOM», которые для typeof все на одно лицо ("object"). Вернее их было бы назвать «классами типа object», но не будем пока погружаться в терминологию.

Когда знание типа не нужно

В большинстве случаев выяснять тип не требуется.

Если функция принимает в качестве аргумента HTMLDivElement с которым выполняет какие-то манипуляции и в документации к ней указана, что она принимает HTMLDivElement, то она может рассчитывать на то, что получит именно HTMLDivElement.

А если программист вызывает её со строкой в качестве аргумента, то это проблемы программиста. И проблемы в том самом месте, где он её вызывает.

Когда знание типа может пригодиться

При попытке же написать более универсальную функцию, знание типа (класса) переменных бывает не лишним.

Например, хотим мы создать функцию вроде map(), которая перебирает элементы структуры, выполняет над ними какие-либо действия и возвращает аналогичную структуру, где вместо исходных элементов результаты этих действий. Или merge() — рекурсивное слияние двух структур.

Здесь уже перебирать и сливать различные значения нужно по разному. Простые объекты через for (k in obj), массивы и подобные им (arguments, HTMLCollection) через for (i=0;i<len;i++). При этом Function, например, тоже объект со своими свойствами, но при слиянии мы вправе ожидать, что скопируется сам объект функции, а не будут рекурсивно сливаться его свойства.

Для этого нам нужно знать, что перед нами — сугубо говоря, «словарь», «список» или «индивидуальный объект».
Остальной текст под катом

Генератор сео-поебени

Приходит тут дизайнер Асанов весь такой из себя и говорит: «вот тут у меня набор бессмысленных слов, хочу из них составить множество ссылок и завалить ими весь интернет».

А я ему — да не вопрос, для тебя ничего не жалко, пятница ведь.
А так как мне вообще ничего не для кого не жалко, то вот — генератор ссылок для сеопульта.

Мировые новости за февраль

Twitter променял Гугл на Яндекс.

А Гугл в отместку Яндексу сделал панорамы российских городов.
Яндекс правда сделал их давно, но побоялся гопников и не заехал ко мне в район.
Гугл же даже панорамы моего двора разместил.
Так что теперь я люблю Гугля.

Американские солдаты будут ходить в кевларовых труселях, а Sony разошлась с Ericsson.

Гуглу же было мало панорамы моего двора и он занялся панорамами Большого Барьерного рифа.

PHP разучился считать до 2-х и разродился 8-м релизкандидатом версии 5.4.

А Гугл тем временем не унимается и обещает реализовать в своём браузере новый стандарт ECMA.
Стандарт называется Harmony и всем теперь будет гармония и Щастье.
Хотя Firefox давно уже начал всё это реализовывать, но никому до этого нет дела.

Украинская милиция закрыла файлообменный сервис ex.ua. Или не закрыла. Ещё не известно, да и всем похер.

Биомедики создали имплантат для плавания по кровотоку.
Теперь он излечит нас от всех болезней.
Или всех убьёт, но это уже частности.

Инженеры создали сканер бактерий для мобильника.
Теперь можно сканировать микробов не вставая с унитаза.
Всё бы им какую-нибудь херню сделать.

Открылся музей техники Apple.

Гугл же в Хроме не только реализует новый стандарт ECMA, но и прекратит отслеживать поведение пользователей.
Наконец-то можно будет смотреть в интернете какую-нибудь гадость и не ощущать над собой его всевидящее око.

getCookie сосёт

Лет 15 назад какой-то кудесник написал следующую функцию на тогда ещё новом языке JavaScript:

function getCookie(name) {
    var start = document.cookie.indexOf(name + "=");
    var len = start + name.length + 1;
    if ((!start) && (name != document.cookie.substring(0, name.length))) {
        return null;
    }
    if (start == -1) return null;
    var end = document.cookie.indexOf(';', len);
    if (end == -1) end = document.cookie.length;
    return unescape(document.cookie.substring(len, end ));
}

С тех пор она обошла весь интернет и сотню рейтингов типа «10 самых обосраться лучших JavaScript-функций за все времена».

С тех пор все подряд либо тянут её себе, либо, как обычно, переписывают на свою «ещё более лучшую, ведь я программист», но везде впихивают этот грёбаный indexOf().
Чем он вам понравился?
Даже Дэвид Флэнаган в своём «подробном руководстве» не удержался.

indexOf(name + "=") — мы здесь не переменную «name» ищем, мы ищем переменную, заканчивающуюся на «name».
Что следующий код нам вернёт?

setCookie("sex", "yes");
setCookie("x", "no");
 
console.log(getCookie("x"));

Правильно:

sex=yes; x=no;

Ну и escape/unescape совершенно для других целей нужны.

А посему:

function getAllCookie() {
    var parts  = document.cookie.split(";"),
        cookie = {},
        part,
        name,
        value,
        i,
        len = parts.length;
    for (i = 0; i < len; i += 1) {
        part  = parts[i].split("=");
        name  = part[0].replace(/^\s+/, "").replace(/\s+$/, "");
        value = (part[1] || "").replace(/^\s+/, "").replace(/\s+$/, "");
        cookie[name] = decodeURIComponent(value);
    }
    return cookie;
}

mysqldump: игнорирование данных в определённых таблицах

mysqldump

(картинку увёл с adw0rd.ru)

Итак, хотим мы, значит, сделать дамп какой-то mysql-базы с рабочего проекта.
Чтобы скачать себе и развернуть у себя локальную копию.
Или просто в целях бэкапа.

Ну и, конечно, для этого у нас есть наша любимая утилита mysqldump.

Но вот незадача, есть в базе штук пять таблиц в которые пишутся различные логи.
И написалось их уже за время работы сайта, аж на 10 гигабайт.
10 гигабайт эти нам совершенно ни к чему, ни в бэкапе их хранить незачем, ни тем более на локалку себе выкачивать не хочется.
Но и удалять тоже жалко, вдруг пригодятся.


Ну ладно, просто воспользуемся опцией --ignore-table-data, которая, конечно, где-то в обильном списке опций должна быть.
Опа, а нет, оказывается, ничего подобного.
Только заявка на неё и благодарность за заявку.

Какие же другие варианты у нас есть?

--ignore-table: просто игнорировать таблицы. Не катит, структура нам нужна, в них же всё равно что-то писаться будет.

--where="true limit 100": выбрать только сотню записей. Плохо, другие таблицы нам нужны полными.

Придётся сделать в два захода:

1. Сохранить для таблиц с логами только структуру (--no-data).

2. Сделать дамп всех остальных таблиц.

И в сочетании с моими потугами о области изучения баша, получается следующее (здесь мы ещё заодно архивируем дамп в файл с указанием текущей даты):

#!/bin/sh
 
DB_NAME="dbname"
DB_USER="username"
DB_PASS="qwerty"
 
OUTPUT_FILE="$DB_NAME-$(date +%Y-%m-%d).sql.tar.gz"
 
TMP_SQL_FILE="$DB_NAME.sql"
 
tables_cmd=""
ignore_cmd=""
 
for table in "log_table_1" "log_table_2" "log_table_3"
do
    tables_cmd="$tables_cmd $table"
    ignore_cmd="$ignore_cmd --ignore-table=$DB_NAME.$table"
done
 
echo "Dump to $TMP_SQL_FILE"
 
mysqldump \
    -u$DB_USER \
    -p$DB_PASS \
    --databases $DB_NAME \
    --no-create-db \
    --add-drop-table \
    $ignore_cmd \
    > $TMP_SQL_FILE;
 
echo "Append big tables structures to $TMP_SQL_FILE"
 
mysqldump \
    -u$DB_USER \
    -p$DB_PASS \
    --databases $DB_NAME \
    --no-create-db \
    --add-drop-table \
    --tables $tables_cmd \
    --no-data \
    >> $TMP_SQL_FILE;
 
echo "Archiving to $OUTPUT_FILE"
tar -czf $OUTPUT_FILE $TMP_SQL_FILE
 
echo "Remove $TMP_SQL_FILE"
rm $TMP_SQL_FILE

Мои познания в баше не позволили мне вынести список таблиц в отдельную переменную, но и так работает.

Контактики

Обновил страничку контактов для вас мои дорогие.

Там мои мыльца, жежешечки, твиттерочки и гуглоплюсики.

Френдите, фоловьте, плюсуйте и следуйте за мной на твиттер, БЛЕАДЬ!

Локальные новости за последний год

На дворе конец февраля — время выносить ёлку и писать отчёт о прошедшем годе.

Весь прошедший год мы хуячили без обеда и выходных, бездельничали и снова хуячили.
Сделали много лабуды и не сделали много полезных вещей.
Познакомились со многими интересными людьми, в том числе с настолько интересными, что лучше бы не знакомились.
Обогатились бесценным опытом о том, как делать множество новых для нас вещей.
И ещё более бесценным о том, как их делать не стоит.

Hotel-inn

Ну и так, как нужно показать что-то материальное: встречайте, альфа-версия системы бронирования гостиниц Hotel-inn.
В ролях: я, дизайнер Асанов, программист Марио и другие.
Сначала я хотел показать её тогда, когда мы наконец её закончим. Потом, когда её закончат уже другие люди. А теперь приходится показывать, пока эти люди ещё не успели всё убить.


Остальной текст под катом

Программист на вырост (PHP), СПб от 35 000

Вакансия закрыта

Мы хотим себе веб-программиста.

Веб-программист должен:

  • Иметь опыт участия в разработке проектов среднего уровня.
  • Иметь горячее желание повышать уровень своих проектов.
  • Иметь желание повышать свой собственный уровень, как программиста.

Веб-программист должен знать:

  • PHP5 (желательно 5.3 с неймспейсами и всем остальным)
  • JavaScript (работать с jQuery и иметь представление о том, как она сама работает)
  • MySQL
  • HTML и CSS на уровне «внедрить и подправить». Верстать макеты заставлять не будем.
  • Unix, хотя бы на уровне пользователя.
  • ООП, MVC и т.д. и т.п.

Веб-программист получит от нас:

  • Рабочее место на 40 часов в неделю
  • от 35 000 рублей в месяц в начале
  • Ещё больше рублей в месяц в зависимости от успехов
  • Молодой разнополый коллектив, офис в центре, дартс и печенюшки
  • Возможность развиваться в профессиональном плане

Контакты: oleg.grigoriev@insaito.ru.

По страницам: 123456789101112131415