Марейн Хавербеке - Выразительный JavaScript
- Название:Выразительный JavaScript
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:978-1593275846
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Марейн Хавербеке - Выразительный JavaScript краткое содержание
В процессе чтения вы познакомитесь с основами программирования и, в частности, языка JavaScript, а также выполните несколько небольших проектов. Один из самых интересных проектов — создание своего языка программирования.
Выразительный JavaScript - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
for (var event in map)
console.log("Корреляция для '" + event
"' получается " + map[event]);
// → Корреляция для 'пицца' получается 0.069
// → Корреляция для 'тронул дерево' получается -0.081
Итоговый анализ
Чтобы найти все типы событий, представленных в наборе данных, мы обрабатываем каждое вхождение по очереди, и затем создаём цикл по всем событиям вхождения. Мы храним объект phis
, в котором содержатся корреляционные коэффициенты для всех типов событий, которые мы уже нашли. Если мы встречаем новый тип, которого ещё не было в phis
, мы подсчитываем его корреляцию и добавляем её в объект.
function gatherCorrelations(journal) {
var phis = {};
for (var entry = 0; entry < journal.length; entry++) {
var events = journal[entry].events;
for (var i = 0; i < events.length; i++) {
var event = events[i];
if (!(event in phis))
phis[event] = phi(tableFor(event, journal));
}
}
return phis;
}
var correlations = gatherCorrelations(JOURNAL);
console.log(correlations.пицца);
// → 0.068599434
Смотрим, что получилось:
for (var event in correlations)
console.log(event + ": " + correlations[event]);
// → морковка: 0.0140970969
// → упражнения: 0.0685994341
// → выходной: 0.1371988681
// → хлеб: -0.0757554019
// → пудинг: -0.0648203724
// и так далее...
Большинство корреляций лежат близко к нулю. Морковки, хлеб и пудинг, очевидно, не связаны с обращением в белку. Но оно вроде бы более часто происходит на выходных. Давайте отфильтруем результаты, чтобы выводить только корреляции больше 0,1 или меньше -0,1
for (var event in correlations) {
var correlation = correlations[event];
if (correlation > 0.1 || correlation < -0.1)
console.log(event + ": " + correlation);
}
// → выходной: 0.1371988681
// → чистил зубы: -0.3805211953
// → конфета: 0.1296407447
// → работа: -0.1371988681
// → спагетти: 0.2425356250
// → читал: 0.1106828054
// → арахис: 0.5902679812
Ага! У двух факторов корреляции заметно больше остальных. Арахис сильно влияет на вероятность превращения в белку, тогда как чистка зубов наоборот, препятствует этому.
Интересно. Попробуем вот что:
for (var i = 0; i < JOURNAL.length; i++) {
var entry = JOURNAL[i];
if (hasEvent("арахис", entry) &&
!hasEvent("чистка зубов", entry))
entry.events.push("арахис зубы");
}
console.log(phi(tableFor("арахис зубы", JOURNAL)));
// → 1
Ошибки быть не может! Феномен случается именно тогда, когда Жак ест арахис и не чистит зубы. Если б он только не был таким неряхой относительно оральной гигиены, он бы вообще не заметил своего несчастья.
Зная это, Жак просто перестаёт есть арахис и обнаруживает, что трансформации прекратились.
У Жака какое-то время всё хорошо. Но через несколько лет он теряет работу, и в конце концов ему приходится наняться в цирк, где он выступает как Удивительный Человек-белка, набирая полный рот арахисового масла перед шоу. Однажды, устав от столь жалкого существования, Жак не обращается обратно в человека, пробирается через дыру в цирковом тенте и исчезает в лесу. Больше его никто не видел.
Дальнейшая массивология
В конце главы хочу познакомить вас ещё с несколькими концепциями, относящимися к объектам. Начнём с полезных методов, имеющихся у массивов.
Мы видели методы push
и pop
, которые добавляют и отнимают элементы в конце массива. Соответствующие методы для начала массива называются unshift
и shift
.
var todoList = [];
function rememberTo(task) {
todoList.push(task);
}
function whatIsNext() {
return todoList.shift();
}
function urgentlyRememberTo(task) {
todoList.unshift(task);
}
Данная программа управляет списком дел. Вы добавляете дела в конец списка, вызывая rememberTo("поесть")
, а когда вы готовы заняться чем-то, вызываете whatIsNext()
, чтобы получить (и удалить) первый элемент списка. Функция urgentlyRememberTo
тоже добавляет задачу, но только в начало списка.
У метода indexOf
есть родственник по имени lastIndexOf
, который начинает поиск элемента в массиве с конца:
console.log([1, 2, 3, 2, 1].indexOf(2));
// → 1
console.log([1, 2, 3, 2, 1].lastIndexOf(2));
// → 3
Оба метода, indexOf
и lastIndexOf
, принимают необязательный второй аргумент, который задаёт начальную позицию поиска.
Ещё один важный метод – slice
, который принимает номера начального (start) и конечного (end) элементов, и возвращает массив, состоящий только из элементов, попадающих в этот промежуток. Включая тот, что находится по индексу start, но исключая тот, что по индексу end.
console.log([0, 1, 2, 3, 4].slice(2, 4));
// → [2, 3]
console.log([0, 1, 2, 3, 4].slice(2));
// → [2, 3, 4]
Когда индекс end не задан, slice
выбирает все элементы после индекса start. У строк есть схожий метод, который работает так же.
Метод concat
используется для склейки массивов, примерно как оператор +
склеивает строки. В примере показаны методы concat
и slice
в деле. Функция принимает массив array
и индекс index
, и возвращает новый массив, который является копией предыдущего, за исключением удалённого элемента, находившегося по индексу index
.
function remove(array, index) {
return array.slice(0, index).concat(array.slice(index + 1));
}
console.log(remove(["a", "b", "c", "d", "e"], 2));
// → ["a", "b", "d", "e"]
Строки и их свойства
Мы можем получать значения свойств строк, например length
и toUpperCase
. Но попытка добавить новое свойство ни к чему не приведёт:
var myString = "Шарик";
myString.myProperty = "значение";
console.log(myString.myProperty);
// → undefined
Величины типа строка, число и булевские – не объекты, и хотя язык не жалуется на попытки назначить им новые свойства, он на самом деле их не сохраняет. Величины неизменяемы.
Но у них есть свои встроенные свойства. У каждой строки есть набор методов. Самые полезные, пожалуй – slice
и indexOf
, напоминающие те же методы у массивов.
console.log("кокосы".slice(3, 6));
// → осы
console.log("кокос".indexOf("с"));
// → 4
Разница в том, что у строки метод indexOf
может принять строку, содержащую больше одного символа, а у массивов такой метод работает только с одним элементом.
console.log("раз два три".indexOf("ва"));
// → 5
Метод trim
удаляет пробелы (а также переводы строк, табуляцию и прочие подобные символы) с обоих концов строки.
console.log(" ладно \n ".trim());
// → ладно
Мы уже сталкивались со свойством строки length
. Доступ к отдельным символам строчки можно получить через метод charAt
, а также просто через нумерацию позиций, как в массиве:
var string = "abc";
console.log(string.length);
// → 3
Интервал:
Закладка: