Более компактный код на JavaScript


heilmann Christian Heilmann советует начинающим программировать на JavaScript, как писать более компактный код с использованием встроенных возможностей JavaScript.

Краткая запись

В JavaScript для некоторых конструкций имеется альтернативная сокращенная запись

Задание свойств объекта

var car = new Object();
car.colour = 'red';
car.wheels = 4;
car.hubcaps = 'spinning';
car.age = 4;

Эквивалентная запись:

var car = {
  colour:'red',
  wheels:4,
  hubcaps:'spinning',
  age:4
}

Массивы

Создание массива

var moviesThatNeedBetterWriters = new Array(
  'Transformers','Transformers2','Avatar','Indiana Jones 4'
);

можно записать короче:

var moviesThatNeedBetterWriters = [
  'Transformers','Transformers2','Avatar','Indiana Jones 4'
];

В то же время, ассоциативный массив - это тот же объект, и вместо создания массива car:

var car = new Array();
car['colour'] = 'red';
car['wheels'] = 4;
car['hubcaps'] = 'spinning';
car['age'] = 4;

проще задать свойства объекта car (см. выше Задание свойств объекта).

Тернарный оператор

Очень часто встречается конструкция присвоения значения переменной в зависимости от выполнения условия:

var direction;
if(x < 200){
  direction = 1;
} else {
  direction = -1;
}

Все это можно записать с использованием тернарного оператора

var direction = x < 200 ? 1 : -1;

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

Еще пример - проверка попадания числа в заданный интервал на JavaScript в одну строку:

function IsInRange()
{  // Переменные с примерными значениями:
   var value=5 // проверяемое значение
   var v_left=0 // граница интервала слева
   var v_right=10 // граница справа
   leftInclude=true, rightInclude=true // включать граничное значение

/* Без тернарного оператора было бы так:
   var c1, c2;

   if (leftInclude)
      c1 = (value >= v_left);
   else
      c1 = (value > v_left);

   if (rightInclude)
      c2 = (value <= v_right);
   else
      c2 = (value < v_right);

   return (c1 && c2);

   А вот так в одну длинную строку:
*/
  return (leftInclude ? (value >= v_left) : (value > v_left)) &&
         (rightInclude ? (value <= v_right) : (value < v_right));
}

(Для заданных значений IsInRange() возвращает true)

Формат данных JSON

Данные можно хранить в массивах и строках с символами-разделителями, но для их использования в JavaScript потребуется преобразование.  JavaScript  работает с данными как с объектами, поэтому сложные данные удобно создавать и хранить как объекты в формате JSON с применением описанного выше синтаксиса краткой записи.

*** Формат JSON (JavaScript Object Notation -Нотация объекта JavaScript - для передачи данных в сериализованном виде), хотя и создан для JavaScript, является универсальным и теоретически поддерживается всеми современными языками программирования.

Например,  описание рок-группы:

var band = {
  "name":"The Red Hot Chili Peppers",
  "members":[
    {
      "name":"Anthony Kiedis",
      "role":"lead vocals"
    },
    {
      "name":"Michael 'Flea' Balzary",
      "role":"bass guitar, trumpet, backing vocals"
    },
    {
      "name":"Chad Smith",
      "role":"drums,percussion"
    },
    {
      "name":"John Frusciante",
      "role":"Lead Guitar"
    }
  ],
  "year":"2009"
}

JavaScript работает с данными в формате JSON без дополнительного преобразования, а в этом формате возвращают данные многие API (JSON-P).

Например, следующий код получает из веб-службы Delicious последние 15 закладок с меткой JavaScript  в формате JSON и выводит их в виде списка:

<div id="delicious"></div><script>
function delicious(o){
  var out = '<ul>';
  for(var i=0;i<o.length;i++){
    out += '<li><a href="' + o[i].u + '">' +
           o[i].d + '</a></li>';
  }
  out += '</ul>';
  document.getElementById('delicious').innerHTML = out;
}
</script>
<script src="http://feeds.delicious.com/v2/json/codepo8/javascript?count=15&callback=delicious"></script>

JSON - это, возможно, самый простой способ описания сложных данных, к тому же, поддерживаемый браузерами (см. JSON). А для использования JSON в PHP применяется функция json_decode().

Встроенные функции JavaScript (Math, Array и String)

Чтобы писать более компактный код, следует внимательно изучать встроенные функции JavaScript.

Найти наибольшее число

Например, вот поиск наибольшего значения в массиве с помощью перебора:

var numbers = [3,342,23,22,124];
var max = 0;
for(var i=0;i<numbers.length;i++){
  if(numbers[i] > max){
    max = numbers[i];
  }
}
alert(max);

То же самое можно сделать без цикла с помощью функции сортировки:

numbers.sort(function(a,b){return b - a});
alert(numbers[0]);
// или весь массив:
alert(numbers.join());

Просто sort() без задания функции сравнения нельзя использовать для массива чисел, т.к. по умолчанию сортировка выполняется лексикографически (сравниваются символы).
Еще одна полезная функция - Math.max(), которая возвращает наибольшее число из списка параметров:

Math.max(12,123,3,2,1123); // возвращает 1123

Эту функцию можно использовать для проверки поддержки некоторых свойств браузером:

var scrollTop= Math.max(
 doc.documentElement.scrollTop,
 doc.body.scrollTop
);

Это решает проблему Internet Explorer. Вы можете прочитать scrollTop текущего документа, но в зависимости от DOCTYPE значение будет присвоено одному свойству, а другое будет undefined  (на эту тему here.)

Функции split() и join() и добавление CSS-классов к элементам DOM

При добавлении класса к элементу DOM это может быть первый класс или этот класс нужно добавить к существующему классу, поставив перед ним пробел.  При удалении класса нужно удалить также пробелы  (это актуально для некоторых старых браузеров).

Возможный вариант функции добавления класса:

function addclass(elm,newclass){
  var c = elm.className;
  elm.className = (c === '') ? newclass : c+' '+newclass;
}

Или с использованием split() и join():

function addclass(elm,newclass){
  var classes = elm.className.split(' ');
  classes.push(newclass);
  elm.className = classes.join(' ');
}

Все наглядно и выполняется автоматически.

RSS FeedИсточник

Опубликовано в рубрике JavaScript |

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *