Базовый JavaScript
Приведение типов. Оператор typeof. Тип объекта. Массивы. Равенство. Область видимости. Ключевое слово let. Функция обратного вызова. Строгий режим "use strict".
Приведение типов
Преобразование между двумя встроенными типами.
Бывает двух типов:
явное:
var a = "55"; var b = Number( a ); a; // "55"b; // 55 - число
неявное:
var a = "42"; var b = a * 1; a; // "55"b; // 55 - число!
Оператор typeof
Оператор typeof
может проверить значение и сказать, какой это тип:
var a;typeof a; // "undefined" a = "hello world";typeof a; // "string" a = 42;typeof a; // "number" a = true;typeof a; // "boolean" a = null;typeof a; // "object" -- странно, ошибка a = undefined;typeof a; // "undefined" a = { b: "c" };typeof a; // "object"
Тип объекта
Относится к составному значению, где можно установить свойства (именованные местоположения), каждое из которых содержит свои собственные значения любого типа.
var obj = { a: "hello world", // свойство b: 42, c: true}; obj.a; // "hello world", обращение через нотацию с точкойobj.b; // 42obj.c; // true obj["a"]; // "hello world", обращение через нотацию со скобкамиobj["b"]; // 42obj["c"]; // true
Обращение через нотацию со скобками, если нужно получить доступ к свойству/ключу, и имя хранится в переменной, например как:
var obj = { a: "hello world", b: 42}; var b = "a"; obj[b]; // "hello world"obj["b"]; // 42
Массивы
Массив
- это объект, который содержит значения (любого типа) не в именованных свойствах/ключах, а в числовых индексированных позициях:
var arr = [ "hello world", 42, true]; arr[0]; // "hello world"arr[1]; // 42arr[2]; // truearr.length; // 3 typeof arr; // "object"
Равенство
Строгое сравнение (
===
) проверяет равенство значений, не применяя принуждениеАбстрактное сравнение (
==
) проверяет равенство значений применяя принуждение
var a = "42";var b = 42; a == b; // truea === b; // false
Избегайте абстрактное сравнение ==
в случаях, если какое-либо значение в сравнении может иметь значение:
true
илиfalse
,0
,""
- пустая строка,[]
- пустой массив.
Пошаговая визуализация алгоритма нестрого сравнения (==) с приведением типов в JavaScript.
Область видимости
Необходима для ограничения доступа. Если какая-либо переменная определена внутри функции, то область её видимости ограничивается этой функцией и функциями вложенными в неё.
Ключевое слово let
Позволяет объявлять переменные, принадлежащие отдельным блокам (парам { .. }
), начиная с ES6.
Источник:
https://github.com/getify/You-Dont-Know-JS/blob/master/up%20%26%20going/ch2.md
Функция обратного вызова
callback
является функцией, которая передается другой функции в качестве аргумента и выполняется после завершения какой-либо операции.
Строгий режим "use strict"
Помещает программу или функцию в «строгий» или «современный» рабочий контекст. ECMAScript 5 добавил новые возможности в язык и изменил некоторые из существующих. По умолчанию они отключены, включить их нужно явно с помощью специальной директивы: "use strict"
. Некоторые функции языка, такие как «классы» и «модули», автоматически включают строгий режим.
Директива "use strict"
может быть указана в начале всей программы или отдельной функции, перед её указанием могут быть только комментарии.
Помимо возможностей, этот контекст предотвращает выполнение определенных действий и вызывает больше исключений.
Поведение в строгом и нестрогом режиме:
присваивание значений в неопределённую (спецификация §11.13.1):
(function() { "use strict"; x = 5; // ReferenceError: x is not defined})(); x = 5; // Создает глобальную переменную x
присваивание значение в свойство только для чтения:
(function() { "use strict"; window.undefined = 5; // TypeError: Cannot assign to read only})(); // property 'undefined' of [object Object] window.undefined = 5; // Ничего не делает
повторные свойства в литерале объекта (спецификация §11.1.5):
(function() { "use strict"; var x = { a: 1, a: 2 }; // SyntaxError: Duplicate data property in object literal })(); // not allowed in strict mode var x = { a: 1, a: 2}; // x равно {a: 2}
function f(a, a) { "use strict";} // SyntaxError: Strict mode function may not have duplicate parameter names function f(a, a) { return a;}f(1,2); // возвращает 2
изменения объекта
arguments
(спецификация §10.6):
function f(x) { "use strict"; arguments[0] = 5; return x;}f(10); // возвращает 10 function f(x) { arguments[0] = 5; return x;}f(10); // возвращает 5
delete
на неизменяемом свойство объекта (спецификация §11.4.1):
(function f(x) { "use strict"; var y = 4; delete f; // SyntaxError: Delete of an unqualified identifier in strict mode. delete x; // SyntaxError: Delete of an unqualified identifier in strict mode. delete y; // SyntaxError: Delete of an unqualified identifier in strict mode. delete window.undefined; // TypeError: Cannot delete property })(); // 'undefined' of [object Object] (function f(x) { var y = 4; delete f; // Возвращает false delete x; // Возвращает false delete y; // Возвращает false delete window.undefined; // Возвращает false})();
определение переменной и функции в контексте вызова через
eval
(спецификация §10.4.2):
(function () { "use strict"; eval("var x = 5"); return x; // ReferenceError: x is not defined})(); (function () { eval("var x = 5"); return x;})(); // Возвращает 5
this
не преобразуется в объект, а если значениеthis
-undefined
илиnull
, то не преобразуется в глобальный объект (спецификация §10.4.3):
function f() { "use strict"; return this;};f.call(4); // возвращает 4f.call(null); // возвращает nullf.call(undefined); // возвращает undefined function f() { return this;};f.call(4); // возвращает [object Number]f.call(null); // возвращает [object global] f.call(undefined); // возвращает [object global]
(function () { "use strict"; return 010 + // SyntaxError: Octal literals are not allowed in strict mode. "\077"; // SyntaxError: Octal literals are not allowed in strict mode.})(); (function () { return 010 + "\077";})(); // возвращает "8?"
больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2);
eval
иarguments
- нельзя изменить или использовать в качестве имени (спецификация §11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1);нельзя использовать
argument.caller
иarguments.callee
(спецификация §13.2);нельзя использовать устаревшую инструкцию
with
(спецификация §12.10).
Источники:
https://coderbyte.com/algorithm/10-common-javascript-interview-questions