Типы данных

Чистяков Денис

Who are you to lecture me? *

 

* Кто ты такой, чтобы читать мне лекции?

Содержание

  • Строки
  • Массивы
  • Объекты
  • Функции

Строки

Строки полезны для хранения данных, которые можно представить в текстовой форме.
Mozilla Developer Network

Создание строки


// Пустая строка
var emptyString = '';

// Длина строки
emptyString.length; // 0

Создание строки


// Можно использовать одинарные кавычки
var russianString = 'строка текста';

russianString.length; // 13
        

// Можно использовать двойные кавычки
var russianString = "строка текста";

russianString.length; // 13
        

Создание строки


var escapeCodesString = 'a\'b' // a'b

escapeCodesString.length; // 3
        

var escapeCodesString = 'a\\b' // a\b

escapeCodesString.length; // 3
        

var escapeCodesString = 'a\n\tb' // a
                                 //     b

escapeCodesString.length; // 4
        

Создание строки


// Поддерживаются все символы из Unicode
var utf8String = '中文 español English বাংলা русский 日本語 ਪੰਜਾਬੀ 한국어 தமிழ்';

utf8String.length; // 53
        

Строки являются незаписываемыми


var russianString = 'кот';

// Возможно обращение к символу по индексу
russianString[1]; // 'о'

// Редактирование невозможно
russianString[1] = 'и';
russianString; // 'кот'
        

Срезы из строк


// Обрезаем строку до 140 символов под длину твита
var longString = 'Очевидно проверяется, что математический анализ \
существенно масштабирует интеграл по поверхности, что неудивительно. \
Первая производная, очевидно, позиционирует ортогональный определитель.'

var shortString = longString;
if (longString.length > 140) {
  shortString = longString.slice(0, 139) + '…';
}

shortString; // 'Очевидно проверяется, что математический анализ
// существенно масштабирует интеграл по поверхности, что неудивительно.
// Первая производная, оч…'
shortString.length; // 140
        

Поиск в строке


var tweet = 'PWA. Что это такое? Третий доклад на WSD в Питере Сергея ' +
  'Густуна #wstdays';

// Находим индекс первого вхождения подстроки в строке
tweet.indexOf('#wstdays'); // 65

// Искомая подстрока отсутствует
tweet.indexOf('#fronttalks'); // -1
        

Массивы

Массивы являются спископодобными объектами, чьи прототипы содержат методы для операций обхода и изменения массива. Ни размер JavaScript-массива, ни типы его элементов не являются фиксированными.
Mozilla Developer Network

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


// Пустой массив
var emptyArray = [];

emptyArray.length; // 0

// Массив чисел
var arrayOfNumbers = [1, 2, 3, 4];

arrayOfNumbers.length; // 4

// Массив строк
var arrayOfStrings = ['a', 'b', 'c'];

arrayOfStrings.length; // 3

Итерирование по массиву


var tweets = [
  'Я и ИоТ, пятый доклад на WSD в Питере Вадима Макеев #wstdays',
  'Вёрстка писем. Развенчиваем мифы. Четвёртый доклад на WSD в Питере Артура Коха #wstdays',
  'PWA. Что это такое? Третий доклад на WSD в Питере Сергея Густуна #wstdays',
  'Pokémon GO на веб-технологиях, второй доклад на WSD в Питере Егора Коновалова #wstdays',
  'Ого сколько фронтендеров. #wstdays',
  '<head> — всему голова, первый доклад на WSD в Питере Романа Ганина #wstdays',
  'Доброе утро! WSD в Питере начинается через 30 минут: программа, трансляция и хештег #wstdays',
  'Наглядная таблица доступности возможностей веб-платформы Пола Айриша: Can I use + StatCounter, от CSS до JS',
  'Node.js, TC-39 и модули, Джеймс Снел о проблемах Node.js с асинхронными модулями ES и вариантах выхода из ситуации',
  'Всегда используйте <label>, перевод статьи Адама Сильвера в блоге Академии HTML',
  'JSX: антипаттерн или нет? Заметка Бориса Сердюка на Хабре',
  'Как прятать инлайновые SVG-иконки от читалок, Роджер Йохансен объясняет, зачем это нужно'
];

tweets.length; // 12
        

Итерирование по массиву


for (var i = 0; i < tweets.length; i++) {
  var tweet = tweets[i];

  // Что-то делаем с конкретным твитом
}
        

Добавление / удаление из массива


var emptyArray = [];

// Добавляем элементы
emptyArray.push('a');
emptyArray.push('b');
emptyArray; // ['a', 'b']

emptyArray.length; // 2

// Удаляем последний элемент
emptyArray.pop(); // 'b'
emptyArray; // ['a']

emptyArray.length; // 1

Объединение массивов


var concatedArray = arrayOfNumbers.concat(arrayOfStrings);

concatedArray; // [1, 2, 3, 4, 'a', 'b', 'c']

arrayOfNumbers; // [1, 2, 3, 4]
arrayOfStrings; // ['a', 'b', 'c']
        

Поиск в массиве твитов


// Найдем все строки, содержашие хештег #wstdays в массиве
var result = [];

for (var i = 0; i < tweets.length; i++) {
  var tweet = tweets[i];

  if (tweet.indexOf('#wstdays') !== -1) {
    result.push(tweet);
  }
}
        

Операции с массивом твитов


// Копируем оригинальную ленту в новый массив
var tweetsWithAdv = tweets.slice();

// Добавим немного рекламы в ленту, изменяя копию
tweetsWithAdv.splice(4, 0, 'Покупайте наших слонов!');
tweetsWithAdv.splice(9, 0, 'И натяжные потолки тоже у нас отличные!');

tweets.length; // 12
tweetsWithAdv.length; // 14

Операции с массивом твитов


// Постраничная навигация
var tweetsByPage = tweetsWithAdv.slice(5, 10);
        

Объекты

Список, состоящий из пар с именем свойства и связанного с ним значения, которое может быть произвольного типа.
Mozilla Developer Network

Создание объекта


// Пустой объект
var emptyObject = {};
        

// Объект с предопределенным набором свойств
var tweet = {
  createdAt: 'Sat Oct 01 12:01:08 +0000 2016',
  id: 782188596690350100,
  text: 'Я и ИоТ, пятый доклад на WSD в Питере Вадима Макеева #wstdays',
  user: {
    id: 42081171,
    name: 'Веб-стандарты',
    screenName: 'webstandards_ru',
    followersCount: 6443
  },
  hashtags: ['wstdays']
};
        

Обращение к свойствам объекта


// Получение значения свойства через точечную нотацию
emptyObject.propertyName = 'foo'; // { propertyName: 'foo' }
emptyObject.propertyName; // 'foo'
        

// Удаление свойства
delete emptyObject.propertyName; // {}
        

tweet.id; // 782188596690350100
tweet.user.screenName; // 'webstandards_ru'
        

// Получение значения свойства через квадратные скобки
tweet['i' + 'd']; // 782188596690350100
        

Итерирование по ключам объекта


var keys = Object.keys(tweet);

keys; // ['createdAt', 'id', 'text', 'user', 'hashtags']

for (var i = 0; i < keys.length; i++) {
  var key = keys[i];
  var value = tweet[key];

  // Что-то делаем с ключом и со значением
}
        

Проверка наличия свойства у объекта


tweet.hasOwnProperty('text'); // true
        

tweet.hasOwnProperty('nonExistantProperty'); // false
        

Функции

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

Декларация функции


function getFollowersCount() {
  return 6443;
}
        

Декларация функции


function noop() {
}
        

Декларация функции


function noop() {
  return undefined;
}
        

Декларация функции


function getAuthor(tweet) {
  return tweet.user.screen_name;
}
        

Передача по значению и по ссылке


tweet.user.followersCount; // 6443

function incrementFollowersCount(count) {
  count++; // 6444
}

incrementFollowersCount(tweet.user.followersCount);

tweet.user.followersCount; // 6443
        

Передача по значению и по ссылке


tweet.user; // { id: 42081171, name: 'Веб-стандарты',
// screenName: 'webstandards_ru', followersCount: 6443 }

function incrementFollowersCount(user) {
  user.followersCount++;
}

incrementFollowersCount(tweet.user);
tweet.user; // { id: 42081171, name: 'Веб-стандарты',
// screenName: 'webstandards_ru', followersCount: 6444 }
        
Функции — объекты высшего порядка.

Они могут быть переданы в другие функции в качестве аргумента, а так же могут иметь личные свойства, как и другие объекты.

Передача функций в качестве аргументов


var tweets = [
  { hashtags: ['wstdays'], likes: 16, text: 'Я и ИоТ, пятый…' },
  { hashtags: ['wstdays', 'mails'], likes: 33, text: 'Вёрстка писем…' },
  { hashtags: ['wstdays'], likes: 7, text: 'PWA. Что это…' },
  { hashtags: ['wstdays', 'pokemongo'], likes: 12, text: 'Pokémon GO на…' },
  { hashtags: ['wstdays'], likes: 15, text: 'Ого сколько фронт…' },
  { hashtags: ['wstdays', 'html'], likes: 22, text: '<head> — всему…' },
  { hashtags: ['wstdays'], likes: 8, text: 'Доброе утро! WSD…' },
  { likes: 9, text: 'Наглядная таблица доступности…' },
  { hashtags: ['nodejs'], likes: 7, text: 'Node.js, TC-39 и модули,…' },
  { hashtags: ['html'], likes: 28, text: 'Всегда используйте <label>…' },
  { likes: 18, text: 'JSX: антипаттерн или нет?…' },
  { hashtags: ['svg'], likes: 19, text: 'Как прятать инлайновые…' }
];
        

Передача функций в качестве аргументов


var result;

// Теперь в result лежат отфильтрованные твиты
tweets.forEach(filterWithWstdaysHashtag);

// Выбираем только твиты с хештегом #wstdays
function filterWithWstdaysHashtag(tweet, index) {
  var hashtags = tweet.hashtags;
  if (Array.isArray(hashtags) && hashtags.indexOf('wstdays') !== -1) {
    result.push(tweet);
  }
}
        

Передача функций в качестве аргументов


// Теперь в result лежит HTML c деревом твитов
var result = '<dl>' + tweets.filter(filterWithWstdaysHashtag)
                            .map(render)
                            .join('\n') + '</dl>';

// Выбираем только твиты с хештегом #wstdays
function filterWithWstdaysHashtag(tweet, index) {
  var hashtags = tweet.hashtags;
  return Array.isArray(hashtags) && hashtags.indexOf('wstdays') !== -1;
}

// Превращаем массив объектов твитов в HTML-строки
function render(tweet, index) {
  return '<dt>' + tweet.text + '</dt>' +
    '<dd>' + tweet.user + '</dd>' +
    '<dd>' + tweet.hashtags.join(', ') + '</dd>';
}
        

Передача функций в качестве аргументов


var likesCount = tweets.reduce(getTotalLikes, 0)

function getTotalLikes(acc, item) {
  return acc + item.likes;
}

likesCount; // 194
        

Передача функций в качестве аргументов


var hashtagsStat = tweets.reduce(flattenHashtags, [])
    // ['wstdays', 'wstdays', 'mails', 'wstdays', 'wstdays', 'pokemongo',
    // 'wstdays', 'wstdays', 'html', 'wstdays', 'nodejs', 'html', 'svg']
                         .reduce(getHashtagsStats, {});

function flattenHashtags(acc, item) {
  return acc.concat(item.hashtags || []);
}

function getHashtagsStats(acc, item) {
  if (!acc.hasOwnProperty(item)) {
    acc[item] = 0;
  }

  acc[item]++;

  return acc;
}

hashtagsStats; // { html: 2, mails: 1, nodejs: 1, pokemongo: 1, svg: 1, wstdays: 7 }
        

Полезные функции для работы со строками

toLowerCase — приводим строку к нижнему регистру

trim — удаляет пробельные символы с обеих сторон

startsWith — начинается ли строка с подстроки


Все функции для работы со строками

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

sort — сортируем массив

every — удовлетворяют ли все элементы массива условию

some — удовлетворяет ли хотя бы один элемент массива условию

shift — выталкивает из массива первый элемент и возвращает его

unshift — добавляет элемент в начало массива


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

Домашнее задание

Телефонная книга