Если Вы не программист то вам не стоит читать статью дальше.
Если вы программист, но не знаете JavaScript и не хотите знать, то вам также не стоит читать эту стать
Статья #1 из цикла "Кодеру".
Тут я буду размещать некоторые тонкости с которыми мне пришлось столкнуться при написание скриптов.
Данная статья описывает то, как я когда-то столкнулся с проверкой наличия разных флагов которые мне приходилось использовать в своих скриптах.
И так начнем.
Однажды мне пришлось впервые столкнуться с написанием флагов. У меня был код которые требовал наличие разных свойств объекта, однако мне не хотелось использовать для этого дополнительные свойства, и тут мне пришла на ум мысль о минимизации.
Как было:
var obj = {};
obj.id = 1;
obj.selected = false;
obj.checked = false;
Используя эти свойства объекта мне приходилось строить целые цепочки проверок для передачи данных как параметры к AJAX запросу, да и вообще для функци в часности. В данном примере конечно свойств мало, однако я работал с большим количеством.
Однако, когда мне в голову пришла идея минимизировать проверки разного рода и создать флаг-свойств, чтобы не создавать дополнительные свойства объекта.
var SELECTED = 0x1<<1;
var CHECKED = 0x1<<2;
var obj = {};
obj.id = 1;
obj.flags = false;
Теперь собственно для чего все это. Допустим у нас есть некоторая функция которая выявляет свойства объекта:
Схема без флагов
function check(obj, type) {
if (type == 'selected') {
return obj.selected;
}
if (type == 'checked') {
return obj.checked;
}
}
Немного грамоздко не так ли?
А теперь рассмотрим как бы это могло бы выглядеть с флагами:
function check(obj, flag) {
return !!(obj.flags & flag);
}
Таким образом используя флаги мы сократили функцию check(...) до минимума. Даже если мы добавим другие флаги наша функция будет работать для всех флагов.
Ну теперь посмотрим наглядно на примере:
Без флагов.
var obj = {};
obj.id = 1;
obj.selected = false;
obj.checked = false;
function check(obj, type) {
if (type == 'selected') {
return obj.selected;
}
if (type == 'checked') {
return obj.checked;
}
}
obj.selected = true;
obj.checked = true;
var ret_selected = check(obj, 'selected');
var ret_checked = check(obj, 'checked');
Этот код показывает, что чтобы определить установленно ли свойство selected или нет.
Теперь рассмотри пример реализации через флаги.
var SELECTED = 0x1<<1;
var CHECKED = 0x1<<2;
var obj = {};
obj.id = 1;
obj.flags = false;
function check(obj, flag) {
return !!(obj.flags & flag);
}
obj.flags = SELECTED | CHECKED ;
var ret_selected = check(obj,SELECTED);
var ret_checked = check(obj,CHECKED);
Этот пример получился более коротким, что не может не радовать загрузку меньшего кол-ва байт при открытии страницы браузером, а также демонстрирует нам хорошое применение флагов.
Немного о !!(obj.flags & flag);
обыкновенное выражение (obj.flags & flag) даст результат null или flag. Чтобы перевести это в булевый тип достаточно *** логический оператор отрицания !(obj.flags & flag) но к обратному, так-как это всетаки отрицание. Чтобы обратить наше отрицание, достаточно подставить еще одно !!(obj.flags & flag).
Вот собственно и всё.
Переодически буду публиковать всякие идеи и мысли.