Учебник js, cards 1..60 Flashcards
https://learn.javascript.ru
Что умеет JavaScript?
1) Создавать новые HTML-теги, удалять существующие, менять стили элементов, прятать, показывать элементы и т.п. 2) Реагировать на действия посетителя, обрабатывать клики мыши, перемещения курсора, нажатия на клавиатуру и т.п. 3) Посылать запросы на сервер и загружать данные без перезагрузки страницы (эта технология называется “AJAX”). 4) Получать и устанавливать cookie, запрашивать данные, выводить сообщения… …и многое, многое другое!
Что НЕ умеет JavaScript?
1) JavaScript не может читать/записывать произвольные файлы на жесткий диск, копировать их или вызывать программы. Он не имеет прямого доступа к операционной системе. Современные браузеры могут работать с файлами, но эта возможность ограничена специально выделенной директорией – «песочницей». Возможности по доступу к устройствам также прорабатываются в современных стандартах и частично доступны в некоторых браузерах. 2) JavaScript, работающий в одной вкладке, не может общаться с другими вкладками и окнами, за исключением случая, когда он сам открыл это окно или несколько вкладок из одного источника (одинаковый домен, порт, протокол). Есть способы это обойти, и они раскрыты в учебнике, но они требуют специального кода на оба документа, которые находятся в разных вкладках или окнах. Без него, из соображений безопасности, залезть из одной вкладки в другую при помощи JavaScript нельзя. 3) Из JavaScript можно легко посылать запросы на сервер, с которого пришла страница. Запрос на другой домен тоже возможен, но менее удобен, т. к. и здесь есть ограничения безопасности.
Основные фишки HTML5?
1) Чтение/запись файлов на диск (в специальной «песочнице», то есть не любые). 2) Встроенная в браузер база данных, которая позволяет хранить данные на компьютере пользователя. 3) Многозадачность с одновременным использованием нескольких ядер процессора. 4) Проигрывание видео/аудио, без Flash. 5) 2D и 3D-рисование с аппаратной поддержкой, как в современных играх.
Какие основные справочники по стандарту?
1) “RegExp MDN” 2) “RegExp dottoro” 3) “RegExp site:javascript.ru” 4) “document.cookie site:w3.org” …А самые последние версии стандартов – на http://dev.w3.org и на http://whatwg.org/specs/. 5) “innerHeight quirksmode” 6) “caniuse geolocation”
Является ли null «ссылкой на нулевой адрес/объект»
Значение null не является «ссылкой на нулевой адрес/объект» или чем-то подобным. Это просто специальное значение. Оно присваивается, если мы хотим указать, что значение переменной неизвестно.
Что такое undefined?
Значение undefined означает «переменная не присвоена».
Какие способы вызвать диалоговое окно кроме alert есть в js?
«prompt(вопрос[, по_умолчанию])» Задать вопрос и возвратить введённую строку, либо null, если посетитель нажал «Отмена». «confirm(вопрос)» Задать вопрос и предложить кнопки «Ок», «Отмена». Возвращает, соответственно, true/false. «alert(сообщение)»
Чему равен a в следующих неравенствах? var a = xxx; alert( a > 0 ); // false alert( a >= 0 ); // true alert( a == 0 ); // false
alert( null > 0 ); // false, т.к. null преобразовано к 0 alert( null >= 0 ); // true, т.к. null преобразовано к 0 alert( null == 0 ); // false, в стандарте явно указано, что null равен лишь undefined
Сравнение строк, чему равно alert( ‘а’ > ‘Я’ )?
Сравнение строк – лексикографическое, символы сравниваются по своим unicode-кодам. Поэтому получается, что строчные буквы всегда больше, чем прописные: alert( ‘а’ > ‘Я’ ); // true
Чему равно alert( 1 && 2 && 3 )?
3 Результатом логического оператора служит последнее значение в коротком цикле вычислений значения. Выражения хоть и интерпретируются как логические, но то, которое в итоге определяет результат, возвращается без преобразования.
в конструкции switch какой тип сравнения используется в каждом case?
===
что такое break outer; внутри цикла?
Переход на внешний label. Синтаксис: «имя_метки:», ставится она только перед циклами и блоками, например: outer: for(;;) { … for(;;) { … break outer; } } Переход на метку возможен только изнутри цикла, и только на внешний блок по отношению к данному циклу. В произвольное место программы перейти нельзя.
Что вернет функция без return внутри? function f() { } alert( f() ); // ???
function f() { } alert( f() ); // undefined
Будет ли работать код: function f() { for(var i = 0; i != 1; i++) { if(i == 0) var result = -1; else result = 1; } return result; } alert(f());
Да, вернет -1; Переменные, объявленные через var внутри функции, видны везде внутри этой функции, блоки if, for и т.п. на видимость не влияют.
В чем отличия Function Declaration от Function Expression?
Функции, объявленные через Function Declaration, отличаются от Function Expression тем, что интерпретатор создаёт их при входе в область видимости (в начале выполнения скрипта), так что они работают до объявления.
Можно ли сделать рекурсию на Function Expression?
var factorial = function me(n) { return (n == 1) ? n : n * me(n - 1); } alert( factorial(5) ); // 120 alert( me ); // ошибка, нет такой переменной
что вернет alert( +”12test” );
NaN ошибка парсинга
как проверить результат в переменной n на NaN?
isNaN(n) или n !== n или !isFinite(n) // проверяет на NaN и на +/- Infinite
результаты операций: alert( +” -12” ); alert( +” \n34 \n” ); alert( +”” ); alert( +”1 2” );
alert( +” -12” ); // -12 alert( +” \n34 \n” ); // 34, перевод строки \n является пробельным символом alert( +”” ); // 0, пустая строка становится нулем alert( +”1 2” ); // NaN, пробел посередине числа - ошибка
alert( ‘12.34’ / “-2” );
// -6.17
для css что вернет alert(+”12px”)?
// NaN
как распарсить 12px чтобы не было ошибки?
alert( parseInt(‘12px’) ); // 12
alert( parseInt(‘12px’) ) alert( parseFloat(‘12.3.4’) ) alert( parseInt(‘a123’) );
alert( parseInt(‘12px’) ) // 12, ошибка на символе ‘p’ alert( parseFloat(‘12.3.4’) ) // 12.3, ошибка на второй точке alert( parseInt(‘a123’) ); // NaN
Смысл записи? var x = prompt(“Введите значение”, “-11.5”); if (isNaN(x))
var x = prompt(“Введите значение”, “-11.5”); if (isNaN(x)) { alert( “Строка преобразовалась в NaN. Не число” ); } else { alert( “Число” ); }
Какие подводные камни в проверке корректности ввода числа через if(!isNaN(str)) ?
- Пустая строка и строка из пробельных символов преобразуются к 0, поэтому считаются числами. 2. Если применить такую проверку не к строке, то могут быть сюрпризы, в частности isNaN посчитает числами значения false, true, null, так как они хотя и не числа, но преобразуются к ним. alert( isNaN(null) ); // false - не NaN, т.е. “число” alert( isNaN(“\n \n”) ); // false - не NaN, т.е. “число”
Как проверить что в переменной цифровое значение?
function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
Что это? var x = a * b / c ^ 0;
var x = a * b / c ^ 0; // читается как “a * b / c и округлить” Битовые операторы делают любое число 32-битным целым, обрезая десятичную часть.
Как получить длину строки?
alert( str.length );
Как получить символ в строке?
alert( str.charAt(0) ); alert( str[0] ); Индексация с нулевой позиции
Как создать переменную типа char?
Никак, в js есть только строки, и буквы - тоже строки
Что вернут вызовы: alert( ““.charAt(0) ); alert( “” [0] ); ?
alert( ““.charAt(0) ); // пустая строка alert( “” [0] ); // undefined
Как заменить символ в строке?
Никак, в js все строки read-only
Функции для преобразования в верхний/нижний регистр?
Методы toLowerCase() и toUpperCase() меняют регистр строки на нижний/верхний
Какой в js аналог contains?
Для поиска подстроки есть метод indexOf(подстрока[, начальная_позиция]). Также существует аналогичный метод lastIndexOf, который ищет не с начала, а с конца строки. проверка if ( ~str.indexOf(…) ) означает, что результат indexOf отличен от -1, т.е. совпадение есть. Вот так: var str = “Widget”; if (~str.indexOf(“get”)) { alert( ‘совпадение есть!’ ); }
Как получить подстроку в js?
substring, substr, slice
Что делает substring?
Метод substring(start, end) возвращает подстроку с позиции start до, но не включая end. var str = “stringify”; alert(str.substring(0,1)); // “s”, символы с позиции 0 по 1 не включая 1. Если аргумент end отсутствует, то идет до конца строки Отличия от slice: substring(start, end) Отрицательные аргументы интерпретируются как равные нулю. Слишком большие значения усекаются до длины строки: alert( “testme”.substring(-2) ); // “testme”, -2 становится 0 Кроме того, если start > end, то аргументы меняются местами, т.е. возвращается участок строки между start и end:
Что делает substr?
substr(start [, length]) Первый аргумент имеет такой же смысл, как и в substring, а второй содержит не конечную позицию, а количество символов. Если второго аргумента нет – подразумевается «до конца строки».
Что делает со строкой slice?
slice(start [, end]) Возвращает часть строки от позиции start до, но не включая, позиции end. Смысл параметров – такой же как в substring. Отличия от substring: Отрицательные значения отсчитываются от конца строки: alert( “testme”.slice(-2) ); // “me”, от 2 позиции с конца alert( “testme”.slice(1, -1) ); // “estm”, от 1 позиции до первой с конца. Это гораздо более удобно, чем странная логика substring. Отрицательное значение первого параметра поддерживается в substr во всех браузерах, кроме IE8-. Если выбирать из этих трёх методов один, для использования в большинстве ситуаций – то это будет slice: он и отрицательные аргументы поддерживает и работает наиболее очевидно.
Какие кодировки использует js для хранения строк?
Все строки имеют внутреннюю кодировку Юникод. Неважно, на каком языке написана страница, находится ли она в windows-1251 или utf-8. Внутри JavaScript-интерпретатора все строки приводятся к единому «юникодному» виду. Каждому символу соответствует свой код. Есть метод для получения символа по его коду: String.fromCharCode(code) Возвращает символ по коду code: alert( String.fromCharCode(1072) ); // ‘а’
Что делает charCodeAt?
Возвращает код символа на позиции pos. Отсчет позиции начинается с нуля.
Какие проблемы с Ё?
маленькая буква ё имеет код, больший чем я, поэтому ‘ё’(код 1105) > ‘я’(код 1103). Кстати, большая буква Ё располагается в Unicode до А, поэтому ‘Ё’(код 1025) < ‘А’(код 1040). Удивительно: есть буква меньше чем А :)
Что выведет alert( “2” > “14” )?
True. Числа в виде строк сравниваются как строки alert( “2” > “14” ); // true, так как это строки, и для первых символов верно “2” > “1” Если хотя бы один аргумент – не строка, то другой будет преобразован к числу: alert( 2 > “14” ); // false
Какая есть функция сравнения с учетом языковых особенностей?
Все современные браузеры, кроме IE10- (для которых нужно подключить библиотеку Intl.JS) поддерживают стандарт ECMA 402, поддерживающий сравнение строк на разных языках, с учётом их правил. Способ использования: var str = “Ёлки”; alert( str.localeCompare(“Яблони”) ); // -1 Метод str1.localeCompare(str2) возвращает -1, если str1 < str2, 1, если str1 > str2 и 0, если они равны.
Какой способ сравнить в insensitive case?
new Intl.Collator(undefined, {sensitivity: “accent”}).compare(“ёжик”, “ЁЖИК”) Все современные браузеры, кроме IE10- (но есть библиотеки и для него) поддерживают стандарт ECMA 402, предназначенный решить проблемы локализации навсегда с помощью Intl.Collator - умеет правильно сравнивать и сортировать строки. Intl.DateTimeFormat - умеет форматировать дату и время в соответствии с нужным языком. Intl.NumberFormat - умеет форматировать числа в соответствии с нужным языком.
Как создать объект в js?
Создание объектов Пустой объект может быть создан одним из двух синтаксисов: o = new Object(); // (1) o = {}; // пустые фигурные скобки (2) Обычно все пользуются синтаксисом (2), т.к. он короче.
Как объявить свойство в объекте js?
person.name = ‘Вася’; person.age = 25; // запишем ещё одно свойство: с именем ‘age’ и значением 25
Можно ли у объекта удалить свойство?
да delete person.age;
Как проверить, есть ли свойство в js-объекте?
if (“name” in person) { alert( “Свойство name существует!” ); } Впрочем, чаще используется другой способ – сравнение значения с undefined. в JavaScript можно обратиться к любому свойству объекта, даже если его нет, ошибки не будет, но вернется специальное значение undefined: var person = {}; alert( person.lalala ); // undefined, нет свойства с ключом lalala
В чем разница между проверками на существования свойства с помощью in и === undefined?
Свойство может существовать, но со значением undefined
Какие способы получить свойство из объекта?
person.name и person[“name”]
Сработает ли такая инициализация? var menuSetup = { width: 300, ‘height’: 200, “мама мыла раму”: true, size: { top: 90, middle: 60, bottom: 90 } };
да
Какие особенности хранения массива объектов {name: “aaa”, age: 23} в движке?
Движок для экономии памяти хранит такие объекты как метаданные + данные: aaa 23 Петя 22 Маша 19
Как перебрать свойства объекта в цикле?
for (ppp in obj) { /* … делать что-то с obj[ppp] … */ }
Как получить количество свойств в объекте?
Object.keys(menu).length.
Есть ли заданный порядок хранения свойств?
По стандарту – нет. Но некоторое соглашение об этом, всё же, есть. Соглашение говорит, что если имя свойства – нечисловая строка, то такие ключи всегда перебираются в том же порядке, в каком присваивались. Так получилось по историческим причинам и изменить это сложно: поломается много готового кода. С другой стороны, если имя свойства – число или числовая строка, то все современные браузеры сортируют такие свойства в целях внутренней оптимизации.
Что выведет код? var codes = { // телефонные коды в формате “код страны”: “название” “7”: “Россия”, “38”: “Украина”, “1”: “США” }; for (var code in codes) alert( code );
for (var code in codes) alert( code ); // 1, 7, 38 Интерпретатор JavaScript видит, что строка на самом деле является числом и преобразует ключ в немного другой внутренний формат. Дополнительным эффектом внутренних оптимизаций является сортировка. А что, если мы хотим, чтобы порядок был именно таким, какой мы задали? Это возможно. Можно применить небольшой хак, который заключается в том, чтобы сделать все ключи нечисловыми, например, добавим в начало дополнительный символ ‘+’
Как превратить дробь в целое?
var n = 12.345; alert( n.toFixed(2) ); // “12.35” alert( n.toFixed(0) ); // “12” alert( n.toFixed(5) ); // “12.34500”
Сработает ли округление целого типа так - alert(12.toFixed(1)); ?
…Но если число целое, то будет проблема: alert(12.toFixed(1)); // ошибка! Ошибка произойдёт потому, что JavaScript ожидает десятичную дробь после точки. Это – особенность синтаксиса JavaScript. Вот так – будет работать: alert( 12..toFixed(1) ); // 12.0
Какой внутренний размер целых чисел в js?
Все числа в JavaScript, как целые так и дробные, имеют тип Number и хранятся в 64-битном формате IEEE-754, также известном как «double precision».
Чему равно 3e-5?
// здесь 3 сдвинуто 5 раз вправо, за десятичную точку. alert( 3e-5 ); // 0.00003