Типы

Типы значений, которые могут быть представлены и обработаны в языке программирования, известны как типы. Одной из наиболее фундаментальных характеристик языка программирования является набор поддерживаемых им типов.

Ценности

Компьютерные программы работают, манипулируя значениями, такими как 3.14 или “Hello World”.

Переменные

Когда программе необходимо сохранить значение для будущего использования, она присваивает значение (или сохраняет значение) переменной. То, как работают переменные, является фундаментальной характеристикой любого языка программирования.

Типы

Числа

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

Javascript представляет числа, используя 64-битный формат с плавающей запятой, определенный стандартом IEEE 754. (То же самое, что и double в Java, C++ и большинстве современных языков программирования)

Арифметика в Javascript

С числовыми литералами можно использовать следующие операторы: +(сложение), -(вычитание), *(умножение), /(деление), %(по модулю). ES6 добавляет ** для возведения в степень.

Помимо этих основных операторов, Javascript также поддерживает сложные математические операции с помощью набора функций и констант, определенных как свойства объекта Math. Примеры:

Math.pow(2, 53);     // 2 to the power 53
Math.abs(-5);        // absolute value of -5

ES6 определяет еще больше функций в объекте Math.

Двоичные числа с плавающей запятой и ошибки округления

Представление с плавающей запятой IEEE-754, используемое в Javascript (и почти во всех других современных языках программирования), представляет собой двоичное представление десятичных чисел, которые мы используем в нашей повседневной жизни. Таким образом, числа в Javascript очень точны, но все же не могут представлять такие числа, как 0,1, в их точном значении. Например:

let x = .3 - .2;    // thirty cents minus 20 cents
let y = .2 - .1;    // twenty cents minus 10 cents
x === y             // => false: the two values are not the same
x === .1            // => false: .3-.2 is not equal to .1

Чтобы решить эту проблему, мы можем использовать масштабированные целые числа. Например, используя целочисленные пайсы вместо дробных рупий.

Целые числа произвольной точности с BigInt

В ES2020 добавлен новый числовой тип BigInt, значения которого являются целыми числами и могут представлять 64-битные целые числа. Литералы BigInt записываются в виде строки цифр, за которой следует строчная буква n. BigInt не поддерживает числа с плавающей точкой/действительные числа. Примеры:

1234n                // A decimal BigInt literal
0b111111n            // A binary BigInt
0o7777n              // An octal BigInt

Даты и время

Javascript определяет простой класс Date для представления и управления числами, которые представляют даты и время.

Даты Javascript являются объектами, но они также имеют числовое представление в виде метки времени, которая указывает количество прошедших миллисекунд с 1 января 1970 года. Использование:

let timestamp = Date.now();   // Current time as a timestamp
let now = new Date();         // Current time as date

Текст

Тип JavaScript для представления текста — String.

Строка — это неизменяемая упорядоченная последовательность 16-битных значений, которая обычно представляет собой набор символов Unicode с кодировкой UTF-16.

Строка использует индексацию с отсчетом от нуля: первое 16-битное значение находится в позиции 0, второе — в позиции 1 и так далее.

Строковые литералы

Чтобы включить строку в программу JS, просто включите ее в совпадающую пару одинарных или двойных кавычек или обратных галочек. Примеры:

'String defined with single quote' 
"String defined with double quotes"
`String defined with back ticks`

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

`"She said 'hi'", he said.`

Работа со строками

В JS строки можно использовать для объединения строк с помощью +. При использовании с числами + добавит их. Но если вы добавите этот оператор к строкам, он добавит вторую строку к первой строке. Пример:

let msg = "Hello, " + "world";   // Returns string "Hello, world"

Сравнение строк можно выполнить с помощью стандартных операторов равенства ===, неравенства !==, <, <= и >, >=.

length свойство строки определяет длину строки.

Javascript предоставляет богатый API для работы со строками, который предоставляет такие свойства, как length (определяет длину строки), substring, slice, splice, split и т. д. Эти методы (кроме длины, которая возвращает число) возвращают новые строки, поскольку строки неизменяемы в Javascript.

Строки можно рассматривать как массивы только для чтения. К символам строк можно обращаться так же, как к элементам массива. Пример:

let s = "Hello";          // Declare a variable with string "Hello"
s[0];                     // Returns H

Литералы шаблона

В ES6 и более поздних версиях строковые литералы могут быть разделены обратными галочками: они называются литералами шаблонов. Литералы шаблонов могут включать произвольные выражения JavaScript. Пример:

let name = "John";
let greeting = `Hello ${ name }`;    // greeting == "Hello John"

Все, что находится между ${ и соответствующим }, интерпретируется как выражение JavaScript.

Литерал шаблона может включать любое количество выражений. Он может использовать любые escape-символы, которые могут использоваться в обычных строках, и может занимать любое количество строк без специального экранирования.

Сопоставление с образцом

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

/[1-9][0-9]*/; // Match a nonzero digit, followed by any # of digits

Методы, используемые объектами RegExp: текст, поиск, сопоставление, замена разделения и т. д.

Логические значения

Логическое значение представляет истину или ложь, включено или выключено, да или нет. Возможны только два значения этого типа. Эти два значения оцениваются зарезервированными словами true и false.

undefined, null, 0, -0, NaN, “” все называются ложными значениями.

Все остальные значения, включая все объекты (и массивы), преобразуются и работают как true. Поэтому они называются истинными ценностями.

нулевой и неопределенный

И null, и undefined являются единственными членами своих специальных типов. Их часто можно использовать взаимозаменяемо. Оба являются ложными значениями.

нулевой

null символизирует отсутствие ценности. Это специальный объект (тип null — объект), который не указывает на объект.

null означает отсутствие значения на уровне программы, обычное или ожидаемое.

неопределенный

undefinedсимволизирует более глубокое отсутствие. Это означает, что значения не были инициализированы. Его тип undefined.

undefined означает системное, неожиданное или похожее на ошибку отсутствие значения.

Символы

Символы были введены в ES6, чтобы служить нестроковыми именами свойств для объектов JS. Пример:

let symbolName = Symbol("propname");

Чтобы получить значение Symbol, вы вызываете функцию Symbol(). Эта функция никогда не возвращает одно и то же значение дважды, даже если вызывается с одним и тем же аргументом.

Symbol.for()returns the одно и то же значение при повторном вызове одних и тех же строк в качестве аргументов, в отличие от функции Symbol(), которая всегда возвращает уникальные значения.

Глобальный объект

Глобальный объект — это обычный объект JavaScript, который имеет глобально определенные идентификаторы в качестве свойств, доступных для программы JavaScript.

Когда интерпретатор JS запускается или веб-браузер загружает новую страницу, он создает новый глобальный объект и дает ему начальный набор свойств, которые определяют 4 вещи: глобальные константы, глобальные функции, функции-конструкторы и глобальные объекты. Примеры: undefined, null, Date() и т. д.

В Node доступ к глобальному объекту можно получить с помощью ключевого слова global.

В браузерах объект window служит глобальным объектом.

ES2020 определяет globalThis как стандартный способ ссылки на глобальный объект в любом контексте. (Реализовано всеми современными браузерами и Node).

Неизменяемые примитивные значения и ссылки на изменяемые объекты

примитивы

  • Примитивы в JavaScript неизменяемы.
  • Примитивы сравниваются по значению.

Объекты

  • Объекты в JavaScript изменяемы.
  • Объекты сравниваются по ссылке. (2 объекта, имеющие одинаковые свойства значения ключа, не равны, потому что их ссылка различна)
  • Чтобы сравнить пары ключ-значение внутри объекта или массива, мы должны явно сравнить их свойства или значения. Пример:
let a = [];   // The variable a refers to an empty array.
let b = a;    // Now b refers to the same array.
b[0] = 1;     // Mutate the array referred to by variable b.
a[0];         // => 1: the change is also visible through variable a
a === b;      // => true; as a and b refer to same object

Преобразования типов

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

Конверсии и равенство

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

Явные конверсии

Хотя JavaScript выполняет многие преобразования типов автоматически, иногда нам нужно выполнить явное преобразование, или вы можете предпочесть сделать преобразования явными, чтобы сделать ваш код более понятным.

Функции Boolean(), Number() и String() явно преобразуют значения. Примеры:

Number("3");    // => 3
String(false);  // => "false":  Or use false.toString()
Boolean([]);    // => true

Возражать против примитивных преобразований

Преобразование объектов в примитивы состоит из сложных правил в JS.

Спецификация JavaScript определяет три основных алгоритма преобразования объектов в примитивы: prefer-string, prefer-number и no-preference.

Переменные

Объявление и назначение переменных

Термин «переменная» подразумевает, что могут быть присвоены новые значения: что значение, связанное с переменной, может изменяться по мере выполнения нашей программы. Если мы постоянно присваиваем значение имени, то называем это имя константой, а не переменной. Прежде чем вы сможете использовать переменную или константу в программе JavaScript, вы должны объявить ее

До ES6 переменные объявлялись с помощью var. ES6 и более поздних версиях они могут быть объявлены с помощью let и const. Примеры:

let message = "hello";
let i = 0, j = 0, k = 0;
let x = 2, y = x*x;
const C = 299792.458;

Различия между let, const и var

  • let и const имеют блочную область видимости. var не имеет области блока.
    Хотя var содержится в теле функции, независимо от того, насколько глубоко она вложена.
  • let и const, если они определены на верхнем уровне, объявление имеет глобальную область действия (в узлах и модулях на стороне клиента глобальной областью действия является файл, в котором он определен. В браузерах глобальной областью действия является HTML-документ).
    Принимая во внимание, что глобальные значения объявленные с помощью var, реализуются как свойства глобального объекта.
  • Один и тот же идентификатор с более чем одним let или const объявление дает синтаксическую ошибку.
    Хотя можно объявить один и тот же идентификатор как переменную несколько раз с var.
  • Поднятие происходит с объявлениями var. Таким образом, его можно использовать до того, как он будет инициализирован во внешней функции. (Значение переменной может быть undefined, если мы используем его выше его объявления, потому что оно еще не инициализировано, но определение перемещено вверх, поэтому его использование не выдает ошибку (может привести к ошибкам времени)).< br /> Переменные, объявленные с помощью let и const, также поднимаются, но, в отличие от var, не инициализируются значением по умолчанию. Будет выдано исключение, если переменная, объявленная с помощью let или const, будет прочитана до ее инициализации.

Назначение деструктурирования

  • В деструктурирующем присваивании значение справа от знака равенства представляет собой массив или объект («структурированное» значение), а левая сторона указывает одно или несколько имен переменных с использованием синтаксиса, который имитирует синтаксис литерала массива и объекта. Пример:
let [x, y] = [1,2];         // Same as let x=1, y=2
let [x, ...y] = [1,2,3,4];  // y == [2,3,4] (... used to assign all remaining values to a single variable)

Следующие шаги

Следующие несколько сообщений станут частью серии, посвященной основам и дополнительным темам JavaScript.

Если вам понравилась эта история, нажмите кнопку 👏 и поделитесь ею, чтобы другие тоже могли ее найти! Кроме того, не стесняйтесь оставлять комментарии ниже.

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

Мы нанимаем. Посмотреть вакансии здесь.