Базовый 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; // 42
obj.c; // true
obj["a"]; // "hello world", обращение через нотацию со скобками
obj["b"]; // 42
obj["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]; // 42
arr[2]; // true
arr.length; // 3
typeof arr; // "object"


Равенство

var a = "42";
var b = 42;
a == b; // true
a === b; // false

Избегайте абстрактное сравнение == в случаях, если какое-либо значение в сравнении может иметь значение:

Пошаговая визуализация алгоритма нестрого сравнения (==) с приведением типов в 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" может быть указана в начале всей программы или отдельной функции, перед её указанием могут быть только комментарии.

Помимо возможностей, этот контекст предотвращает выполнение определенных действий и вызывает больше исключений.

Поведение в строгом и нестрогом режиме:

(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; // Ничего не делает
(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
function f(x) {
"use strict";
arguments[0] = 5;
return x;
}
f(10); // возвращает 10
function f(x) {
arguments[0] = 5;
return x;
}
f(10); // возвращает 5
(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
})();
(function () {
"use strict";
eval("var x = 5");
return x; // ReferenceError: x is not defined
})();
(function () {
eval("var x = 5");
return x;
})(); // Возвращает 5
function f() {
"use strict";
return this;
};
f.call(4); // возвращает 4
f.call(null); // возвращает null
f.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?"

Источники:

https://coderbyte.com/algorithm/10-common-javascript-interview-questions

https://learn.javascript.ru/strict-mode

https://ru.stackoverflow.com/questions/435546/%D0%A7%D1%82%D0%BE-%D0%B7%D0%BD%D0%B0%D1%87%D0%B8%D1%82-use-strict