Домашнее задание №8
1. Для практикума из занятия 7 продумать, где можно применить замыкания.
2. Не выполняя кода, ответить, что выведет браузер и почему:
if (!(«a» in window)) <
var a = 1;
>
alert(a);
function a(x) <
return x * 2;
>
var a;
alert(a);
function b(x, y, a) <
arguments[2] = 10;
alert(a);
>
b(1, 2, 3);
function a() <
alert(this);
>
a.call(null);
Решение
1. Для практикума из занятия 7 продумать, где можно применить замыкания.
Мне кажется, что есть вариант использования замыкания при определении координат для обеспечения «телепортации» змейки при достижении границ поля игры.
Предлагаемый вариант предусматривает следующее:
1. В теле функции «move()» создать главную функцию замыкания «coordXY(newUnit)».
2. В функции «coordXY(newUnit)» создать вложенную (возвращаемую) анонимную функцию с перечнем аргументов в условии, которые, затем, будут соответствовать изменениям координат X и Y по соответствующим направлениям движения змейки («x-«, «x+», «y-«, «y+»).
3. В тело вложенной функции поместить ту часть кода, которая отвечает за «телепортацию» змейки.
4. Создать переменную «s» и присвоить ей результат вывода функции «coordXY(newUnit)» со значением «newUnit === undefined», в качестве первого условия, необходимого для создания телепортации.
5. После того, как переменная «s» «стала» функцией, присваиваем ей входящие значения для вложенной функции, соответствующие направлениям изменения координат «s(‘x-‘, ‘x+’, ‘y+’, ‘y-‘);».
Ниже приведен предлагаемый код:
function coordXY (newUnit) <
return function (arg1, arg2, arg3, arg4) <
2. Не выполняя кода, ответить, что выведет браузер и почему:
if (!(«a» in window)) <
var a = 1;
>
alert(a);
В данном примере браузер выведет undefined потому что по условию if строка должна быть неистинной, т.е. без значения, а она имеет числовое значение 1, значит условие не соблюдается, а на этот случай условия вывода нет (undefined), что и выводится в alert.
В данном примере браузер не выведет ничего, т.к. «а» — это имя функции и в теле функции не определено какое-либо действие.
function a(x) <
return x * 2;
>
var a;
alert(a);
В данном примере браузер не выведет ничего, т.к. переменная «a» объявлена без указания значения, а значит в «alert» выводится функция «а», для которой значение переменной «x», указанной в функции, отсутствует.
function b(x, y, a) <
arguments[2] = 10;
alert(a);
>
b(1, 2, 3);
В данном примере браузер выведет в «alert» значение третьего аргумента, которому присвоено значение 10 в теле функции.
function a() <
alert(this);
>
a.call(null);
Слово «this» обозначает объект, который запускает данную функцию. здесь объект отсутствует, значит «this» ничего не обозначает. Браузер понимает, что должен бытьобъект, но не видит какой. В «flert» будет указано, что это объект без названия.
Источник
Задачи с собеседований на понимание основ
Здесь будут рассмотрены задачи JavaScript, задаваемые на реальных собеседованиях.
Желательно самостоятельно решить задачи на понимание основ языка JavaScript.
Ниже представлены условия задач. И далее их решения.
1) Какое будет выведено значение: let x = 5; console.log(x++); ?
2) Чему равно такое выражение: [ ] + false — null + true ?
3) Что выведет этот код: let y = 1; let x = y = 2; alert(x); ?
4) Чему равна сумма [ ] + 1 + 2?
5) Что выведет этот код: alert( «1»[0] )?
6) Чему равно 2 && 1 && null && 0 && undefined ?
8) Что выведет этот код: alert( null || 2 && 3 || 4 ); ?
9) a = [1, 2, 3]; b = [1, 2, 3]; Правда ли что a == b ?
10) Что выведет этот код: alert( +»Infinity» ); ?
11) Верно ли сравнение: «Ёжик» > «яблоко»?
12) Чему равно 0 || «» || 2 || undefined || true || falsе ?
1-я задача — Постфикс и Префикс
1) Какое будет выведено значение: let x = 5; console.log(x++); ?
Ответ 5 . Потому что постфиксная форма записи сначала возвращает старое значение. Об этом шла речь здесь.
Если снова вывести переменную в консоль, то мы увидим уже новое значение.
Или нужно было сделать так.
Сложение различных типов данных
Задача №2 — Сложение различных типов данных в JavaScript
Чему равно такое выражение: [ ] + false — null + true ?
Чтобы правильно решить эту задачу требуется анализ . Поэтому это задание следует выполнить поэтапно .
Математические операции : сложение и вычитание — выполняются последовательно друг за другом. О порядке выполнения операторов читайте здесь.
1-ый этап . Что дает сложение пустого массива с булевым значением [ ] + false ?
Результат false и это строка. Почему?
Следует запомнить, что в подобных выражениях пустой массив [ ] конвертируется в строку «» . Это уже не тип данных object , а тип данных string .
Таким образом в данном контексте запись [ ] + false (сложение массива и false) идентична записи «» + false (сложение строки и false) .
Из прошлой статьи известно, что сложение чего-либо со строкой дает строку .
Тут стоит обратить внимание и на цвет false в консоли — он белый (при темной теме браузера) или черный (при светлой теме): это говорит о строковом типе данных. В то время как булевы значения true или false в консоли имеют фиолетовый цвет .
Итак, сложение пустого массива с булевым значением дает в результате строку.
2-ой этап . Из строки нужно отнять (вычесть) null. Каков результат?
Вычитание из строки другого типа данных — это бессмысленная математическая операция. Поэтому в результате мы увидим NaN — не число.
3-ий этап . Что дает сложение NaN с булевым значением?
Сложение не числа NaN с булевым значением дает в результате NaN .
Итог. Чему равно такое выражение: [ ] + false — null + true ? Ответ NaN .
При решении этой задачи нужно понимать, как работает динамическая типизация.
И самое главное — запомнить особенность с пустым массивом (см. 1-ый этап).
Источник
Логические операторы
В JavaScript есть три логических оператора: || (ИЛИ), && (И) и ! (НЕ).
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
Давайте рассмотрим их подробнее.
Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:
Традиционно в программировании ИЛИ предназначено только для манипулирования булевыми значениями: в случае, если какой-либо из аргументов true , он вернёт true , в противоположной ситуации возвращается false .
В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.
Существует всего четыре возможные логические комбинации:
Как мы можем наблюдать, результат операций всегда равен true , за исключением случая, когда оба аргумента false .
Если значение не логического типа, то оно к нему приводится в целях вычислений.
Например, число 1 будет воспринято как true , а 0 – как false :
Обычно оператор || используется в if для проверки истинности любого из заданных условий.
Можно передать и больше условий:
ИЛИ «||» находит первое истинное значение
Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.
Расширенный алгоритм работает следующим образом.
При выполнении ИЛИ || с несколькими значениями:
Оператор || выполняет следующие действия:
- Вычисляет операнды слева направо.
- Каждый операнд конвертирует в логическое значение. Если результат true , останавливается и возвращает исходное значение этого операнда.
- Если все операнды являются ложными ( false ), возвращает последний из них.
Значение возвращается в исходном виде, без преобразования.
Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.
Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».
Получение первого истинного значения из списка переменных или выражений.
Представим, что у нас имеется ряд переменных, которые могут содержать данные или быть null/undefined . Как мы можем найти первую переменную с данными?
Если бы и currentUser , и defaultUser были ложными, в качестве результата мы бы наблюдали «unnamed» .
Сокращённое вычисление.
Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.
В приведённом ниже примере x не изменяется:
Если бы первый аргумент имел значение false , то || приступил бы к вычислению второго и выполнил операцию присваивания:
Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
В большинстве случаев лучше использовать «обычный» if , чтобы облегчить понимание кода, но иногда это может быть удобно.
Оператор И пишется как два амперсанда && :
В традиционном программировании И возвращает true , если оба аргумента истинны, а иначе – false :
Источник
Что выведет alert или что выведет код ниже alert null 2 undefined
Задачи по теме Условия. Практика на условия if-else в JavaScript
// Задача 30.1
// В переменной month лежит какое-то число из интервала от 1 до 12. Определите в какую пору года попадает этот месяц (зима, лето, весна, осень).
Задача по теме Условия. Конструкция switch-case в JavaScript
// Задача 31.1
// Переменная num может принимать значения 1, 2, 3 или 4. Если она имеет значение 1, то выведите на экран текст ‘зима’, если значение 2 — ‘весна’ и так далее. Если в переменной будет какое-то другое значение — выведите на экран сообщение об ошибке. Решите задачу через switch-case.
switch (num) <
case 1:
alert(‘Зима’);
break;
case 2:
alert(‘Весна’);
break;
case 3:
alert(‘Лето’);
break;
case 4:
alert(‘Осень’);
break;
default:
alert(‘Такого значения нету’);
break;
>
Задача по теме Условия. Тернарный оператор в JavaScript
// Задача 32.1
// Пусть дана переменная num, которая может быть либо отрицательной, либо положительной. Запишите в переменную result число 1, если переменная num больше или равна нулю, и число -1, если переменная num меньше нуля.
let num = -1;
let result = num >=0 ? 1 : -1;
Задачи по теме Условия. Логические операции в JavaScript. Часть 1
//Задача 33.1
// Пусть даны следующие переменные. Используя оператор ==, узнайте, равны ли значения этих переменных или нет.
let a = 2 * (3 — 1);
let b = 6 — 2;
let result = a == b;
// Задача 33.2
// Пусть даны следующие переменные. Используя оператор >, узнайте, больше ли переменная a, чем b.
let a = 5 * (7 — 4);
let b = 1 + 2 + 7;
let result = a > b;
// Задача 33.3
// Используя операцию оператор !=, узнайте, разные ли значения этих переменных или нет.
let a = 2 ** 4;
let b = 4 ** 2;
let result = a != b;
Задачи по теме Условия. Логические операции в JavaScript. Часть 2
// Упражнение 1
// Что выведет код ниже?
alert( null || 2 || undefined );
// Упражнение 2
// Что выведет код ниже?
alert( alert(1) || 2 || alert(3) );
// Ответ: сначала выведет undefined, затем 2
// Упражнение 3
// Что выведет код ниже?
alert( 1 && null && 2 );
// Упражнение 4
// Что выведет код ниже?
alert( alert(1) && alert(2) );
// Ответ: сначала 1, затем undefined
// Упражнение 5
// Что выведет код ниже?
alert( null || 2 && 3 || 4 );
//упражнение 6
let age = 14;
//упражнение 8
let userName = prompt(«Кто там?»);
if(userName == » || userName == null) <
alert(«Отменено»);
> else if (userName == «Админ») <
let password = prompt(«Введите пароль»);
if (password == » || password == null) <
alert(«Отменено»);
> else if (password == «Я главный») <
alert(«Здравствуйте!»);
> else <
alert(«Пароль неверный!»);
>
> else <
alert(«Вы кто такой? Идите отсюда! Я вас не звал!»);
>
Задача по теме Условия. Функция confirm в JavaScript
// Задача 34.1
// Спросите у пользователя, есть ли ему уже 18 лет. Если есть — выведите на экран алерт с текстом для взрослых, а если нет, выведите сообщение о том, что доступ пользователю запрещен.
let userAge = confirm(‘Вам уже есть 18 лет?’);
if (userAge == true) <
alert(‘Этот текст только для совершеннолетних’);
> else <
alert(‘Подрасти, а потом возвращайся!’);
>
Задачи по теме Массивы. Цикл while в JavaScript
// Задача 35.1
// Выведите в консоль числа от 1 до 100.
Задачи по теме Массивы. Ошибки начинающих при работе с циклом while в JavaScript
// Задача 36.1
// В следующем коде программист вывел числа от 10 до 1. В коде, однако, была допущена ошибка, которая привела к тому, что цикл выполняется бесконечно. Исправьте ошибку программиста.
// Задача 36.2
// В следующем коде программист вывел числа от 10 до 1. В коде, однако, была допущена ошибка, которая привела к тому, что цикл выполняется бесконечно. Исправьте ошибку программиста.
// Задача 36.3
// В следующем коде программист вывел числа от 10 до 1. В коде, однако, была допущена ошибка, которая привела к тому, что на экран ничего не вывелось. Исправьте ошибку программиста.
// Задача 36.4
// В следующем коде программист вывел числа от 10 до 1. В коде, однако, была допущена ошибка, которая привела к тому, что на экран ничего не вывелось. Исправьте ошибку программиста.
// Задача 36.5
// В следующем коде программист вывел числа от 10 до 1. В коде, однако, была допущена ошибка, которая привела к тому, что цикл вывел только число 10 и закончил свою работу. Исправьте ошибку программиста.
Задачи по теме Массивы. Цикл for в JavaScript
// Задача 37.1
// С помощью цикла for выведите в консоль числа от 1 до 100.
for (let i = 1; i = 0; i—) <
console.log(i);
>
Задачи по теме Массивы. Накопление результата в цикле JavaScript
// Задача 38.1
// Найдите произведение целых чисел от 1 до 20.
for (let i = 1; i Нравится Показать список оценивших
Задачи по теме Массивы. Цикл for для массивов в JavaScript. Часть 1
// Задача 39.1
// Дан массив с элементами ‘a’, ‘b’, ‘c’, ‘d’, ‘e’. С помощью цикла for выведите все эти элементы на экран.
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’];
for (let i = 0; i Нравится Показать список оценивших
Задачи по теме Массивы. Цикл for для массивов в JavaScript. Часть 2
// Задача 39.6
// Дан массив с элементами 2, 5, 9, 15, 1, 4. С помощью цикла for и оператора if выведите в консоль те элементы массива, которые больше 3-х, но меньше 10.
let arr = [2, 5, 9, 15, 1, 4];
// Задача 39.8
// Дан массив arr. Найдите среднее арифметическое его элементов (сумма делить на количество). Проверьте задачу на массиве с элементами 1, 2, 3, 4, 5.
let arr = [1, 2, 3, 4, 5];
let result = 0;
for (let i = 0; i 0; i—) <
console.log(i);
>
// Задача 39.11
// Дан массив с числами. С помощью цикла выведите на экран все элементы, значение которых совпадает с их порядковым номером в массиве.
let arr = [3, 1, 2, 5, 4];
// Задача 39.13
// Дан массив с числами. С помощью цикла for и функции document.write выведите каждый элемент массива в отдельном абзаце.
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (let i = 0; i Нравится Показать список оценивших
Задачи по теме Массивы. Перебор массива циклом for-of в JavaScript
// Задача 40.1
// Дан массив с элементами ‘a’, ‘b’, ‘c’, ‘d’, ‘e’. С помощью цикла for-of выведите все эти элементы на экран.
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’];
for (let elem of arr) <
document.write(elem + ‘ ‘);
>
// Задача 40.2
// Дан массив с элементами 1, 2, 3, 4, 5. С помощью цикла for-of найдите сумму элементов этого массива.
let arr = [1, 2, 3, 4, 5];
let result = 0;
for (let elem of arr) <
result += elem;
>
// Задача 40.3
// Пусть у вас есть массив с названиями месяцев. С помощью цикла выведите на экран все месяцы из массива. Определите, каким циклом удобнее будет решить эту задачу: циклом for-of или обычным for со счетчиком.
let months = [‘Декабрь’, ‘Январь’, ‘Февраль’];
for (let elem of months) <
document.write(elem + ‘ ‘);
>
// Задача 40.4
// Пусть у вас есть массив с названиями месяцев. Пусть в переменной month хранится номер текущего месяца, например, 10. С помощью цикла выведите все месяцы, а текущий месяц выведите курсивом. Определите, каким циклом удобнее будет решить эту задачу: циклом for-of или обычным for со счетчиком.
let months = [‘Январь’, ‘Февраль’, ‘Март’, ‘Апрель’, ‘Май’, ‘Июнь’, ‘Июль’, ‘Август’, ‘Сентябрь’, ‘Октябрь’, ‘Ноябрь’, ‘Декабрь’];
let month = 10;
Источник