Это раздел из серии черновиков основ JavaScript, которые я начал; (в основном для моей собственной редакции!) чтобы охватить некоторые аспекты JavaScript, которые делают его уникальным; и, возможно, способствует его репутации как кажущегося не «серьезным» языку, если он происходит из другого языка, где правила другие.

Предположим, что JavaScript не является типизированным языком. Это означает, что JavaScript, скажем так, уникален в том, как он интерпретирует переменные и оценивает условия по сравнению со многими другими языками, например, в реализации JavaScript для приведения типов.

Выразительная и гибкая природа JavaScript без необходимости указывать типы переменных связана с оговоркой, что мы должны быть более осторожными при оценке переменных, чтобы избежать неожиданных результатов, как мы увидим. Давайте посмотрим на Принуждение.

Я надеюсь, что это полезный учебник для начинающих по этому аспекту этого самого вездесущего языка!

Принуждение — это когда компилятор пытается «умно» интерпретировать переменные, логика, с которой мы должны быть хотя бы знакомы, чтобы убедиться, что мы понимаем, как оценивается наша логика. чтобы дать результаты, которые мы ожидаем.

Принуждение имеет плохую репутацию, но полезно изучить и понять его, чтобы мы могли быть уверены, что делаем правильные проверки при реализации потоков управления, не говоря уже о том, понимание того, что происходит под капотом, способствуя формированию нашего мнения о JavaScript!…

Все, чему мы не учимся, неотличимо от магии
— Артур Кларк

Вот как мы можем оценить выражение в Python; типизированный язык:

'The year is' + 2019;

Результат:

TypeError: can only concatenate str (not “int”) to str

Конечно, это будет ошибкой 🙄 , так как мы не можем добавить строку к числу.

Теперь в JavaScript это число принуждается к строке.

Попробуйте ввести некоторые из них прямо в консоль вашего браузера или новый терминал в VS Code…

'The year is ' + 2019

… что приводит к конкатенации строк как ‘The year is 2019'

Аналогично:

5 + '5'

возвращает '55'

поскольку компилятор принудил числа к строкам, чтобы объединить их как выходные данные String.

Но как насчет этого…

❓ Чего нам ожидать, пока не пользуясь консолью?

5 + 5 + ‘5’

💡 Спойлер: решение ниже

Ага, ’105'

Компилятор выполнит первую операцию (5 + 5)), затем преобразует ее в строку ’10' и соединит ее с ’5', в результате чего получится ’105'.

Нам весело 🚀

Но с оператором минус все по-другому...

Что вы ожидаете от ввода этого в консоль?

'5' - 5

Ага, номер 0.

Это связано с тем, что строка ‘5' приведена к числу для применения оператора -.

Это приведение типов в JavaScript, оно сделано намеренно и соответствует ожидаемым правилам.

Введено

Часть того, что делает JavaScript таким выразительным (и таким доступным!) — это его динамически типизированный характер, в отличие от типизированного, как Python, C# или Java.

Это означает, что разработчики могут свободно смешивать и сопоставлять типы, переназначая их переменным и используя их для определения потока управления без необходимости указывать, какой тип переменной должен быть (либо при ее создании, или проверка).

Ключевым моментом здесь является то, что это может привести к ошибкам, если мы не встроим защиту для обеспечения соблюдения типов; и не легко обнаруживаемый синтаксис, а как «ошибки» логического/управляющего потока, если мы не учитываем приведение типов при оценке переменных.

Проверка типов с помощью `typeof`

Так как же добавить такую ​​проверку фактического типа переменной? К счастью, мы можем защититься от чего-либо неожиданного, используя защитный код. Это можно сделать, используя ключевое слово const, реализуя транспиляцию TypeScript в кодовой базе, в дополнение к размышлениям о том, что именно мы учитываем для принуждения в потоке управления/логике.

К счастью, при проверке строк и чисел мы можем использовать встроенный в JavaScript метод typeof для проверки типа заданной переменной. Этот метод всегда будет возвращать строку типа этой переменной.

Вы могли заметить, что мы используем одинарные кавычки для строк. В JavaScript для строк допустимы либо одинарные, либо двойные кавычки, либо обратные кавычки (Es6), хотя одиночные кавычки более популярны. В проектах важнее выбрать один вариант и придерживаться его.

Одинарные кавычки (или обратные кавычки` ) позволяют хранить двойные кавычки, например, в строках шаблона HTML, не экранируя их

const htmlString = '<div class=”content”>…</div>'

Давайте создадим несколько переменных.

Введите их в выбранную вами консоль:

const id = 30

const name = ‘Alex’

А затем проверьте их тип:

typeof id

… который возвращает ‘number’, и

typeof name

… который возвращает ‘string’

Таким образом, один из способов добавить некоторую строгость в нашу практику — обеспечить равенство типов с помощью оператора тройного равенства ===:

if (id === 30) {
   console.log(‘We know id is definitely a number!’);
}

Обратите внимание на === . Это гарантирует, что мы строго проверяем число. Строка '30' вернет false.

В большинстве случаев не рекомендуется использовать свободное равенство (==). Результат сравнения с использованием строгого равенства (===) легче предсказать, поскольку приведение типов не может изменить результат.

Правда и ложь

Давайте посмотрим, что делает значения Truthy и Falsy в JavaScript.

истинное значение — это значение, которое преобразуется в истинное при оценке в логическом контексте
MDN

Часто шутят, что у JavaScript есть некоторые причуды, особенно когда речь идет о том, что он считает истинным значением! Но понимание того, какие значения составляют каждое из них в JavaScript, полезно при их оценке и знании того, чего ожидать в зависимости от данных. Вот несколько типичных примеров каждого из них.

ложные значения, означающие, что они будут оцениватьfalse:

  • ложный
  • 0
  • ‘0’
  • ‘’ (пустая строка)
  • null
  • undefined

истинные значения, то есть они будут оценивать true:

  • true
  • ‘0'
  • ‘ ’ (любой токен в строке)
  • 1 (или любое ненулевое число, включая минус!)
  • {} (пустой объект)
  • [] (пустой массив)

Приведение и логические значения

Зная, что представляет собой правдивость, мы можем создать логический контекст для управления потоком, поместив значение в скобки:

const pass = 1;
if (pass) {
   console.log(‘Passed!’);
}

Сводка

Мы видели различные типы данных в JavaScript. Мы можем манипулировать этими типами с помощью арифметических операций и операторов сравнения. Но нам нужно обратить особое внимание как на оператор сложения +, так и на оператор сравнения ==, каждый из которых выполняет преобразование между типами в соответствии с ожидаемыми правилами компиляции.

Это неявное преобразование в JavaScript называется приведением типов и определено в спецификации ECMAScript. По возможности всегда используйте в своем коде оператор строгого сравнения === вместо ==.

Ресурсы по типам и приведению

Сравнения равенства и одинаковости — MDN

Истинные ценности — MDN

Ложные ценности — MDN