Пытаюсь установить дружеские или хотя бы приятельские отношения с JavaScript. Вот пока некоторые мои открытия, которые, быть может, сэкономят вам время.
1.
Операций равенства в языке две. == и ===. Первая, помимо собственно сравнения, пытается еще и привести объекты к общему типу и, поэтому, априори более затратная. Если вы точно уверены в типе объекта, то хороший тон использовать ===.
2.
В Javascript есть всего один числовой тип. И этот тип - 64-битный float. Поэтому, в частности, 1 всегда === 1.000. NaN, ровно как и Infinity это тоже число (number), по крайней мере, если судить по результату
typeof. Последнее получается, если увеличить максимально-возможное число
1.79769313486231570e+3083.
Кстати, о типах. Понятия
класса в Javascript нету в принципе. Но зато есть так называемая
Prototype-based объектная модель. Вообще, это тема проблемная и непростая. Выражение “взрыв мозга” хорошо подходит для её поверхностного описания. По очевидной причине язык не является строго-типизированным.
4.
Блок кода, который {…}, не открывает никакого скоупа. В том смысле, что если вы создали в таком блоке некоторую переменную, то она будет видна всем и после этого блока. Минимально возможный скоуп в Javascript - это скоуп функции. Поэтому классическая “рекомендация хорошего стиля” объявлять переменные в как можно меньшем (глубоком) блоке здесь теряет всякий смысл.
5.
Все сущности могут быть истолкованы как логические true или false. К последним относится
false, null, undefined, пустая строка
”, 0, NaN. К “правдивым” - все остальные. Включая пустой массив [] и строку ‘undefined’ (а это, кстати, именно то, что возвращает typeof несуществующего объекта).
6.
Операция логическое или (
||) может легко быть использована (и это распространенная практика) в качестве присваивания дефолтных значений. Например,
a = b || ‘Baloon’
Дело в том, что эта операция возвращает первый операнд, если он резолвится в true (см. пункт 5) и второй, иначе. Таким образом, если b
undefined, то в a запишется ‘Baloon’. Аналогичным образом работает и операция
&& (логическое и), только она возвращает первый элемент, если он резолвится в false.
7.
Оператор [] может применяться к любому объекту. При этом операнд, переданный внутрь квадратных скобок, преобразуется к строке его методом
toString(), после чего производит выдачу соответствующего поля. Массив - это просто объект имеющий натуральные (плюс ноль, если угодно) числа в качестве названий полей.
8.
Еще немного о массивах. Как вы уже поняли, массив в Javascript это не совсем полноценный массив. Буквально, это просто оболочка над объектом. Массив
[1, 2, 3] отличается от объекта
{0: 1, 1: 2, 2: 3} наличием свойства под названием
length, которое работает слегка не так, как от него ожидают и набором дополнительных утилитарных методов вроде
push(). То самое
length - это вовсе не длина массива, это максимальное целочисленное название поля +1
. Рассмотрим пример,
arr = []; arr[10] = 15;
Угадайте, чему в данном случае равна длина массива? Правильно, 11.
Продолжение, в том или ином виде, обязательно следует…