Зачем в javascript нужны типы данных
Перейти к содержимому

Зачем в javascript нужны типы данных

  • автор:

Типы данных

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

Все типы данных в JavaScript, кроме объектов, являются иммутабельными (значения не могут быть модифицированы, а только перезаписаны новым полным значением)

Литералы#

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

В нашем случае понятие литерала немного отличное. Мы можем представить, что литерал это способ объявления значения какого-либо типа в коде.

Основные типы#

В JS 6 основных типов данных:

  1. Number (числа)
  2. String (строки)
  3. Boolean ( true / false )
  4. null
  5. undefined
  6. Object

Примитивы#

  • Числа ( Number )
  • Строки ( String )
  • Булевые значения ( Boolean )
  • Null ( Null )
  • Undefined ( Undefined )

Object и объектные типы#

  • Объекты ( Object )
  • Массивы ( Array )

Как узнать тип переменной или от чего она наследуется#

Про операторы касающиеся наследования мы будем говорить потом

Чтобы узнать тип переменной имеется оператор typeof

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

Пример, где мы использовали typeof

Приведение типов#

Приведение типов — это процесс преобразования значений из одного типа в другой (например — строки в число, объекта — в логическое значение, и так далее). Любой тип в JavaScript, идёт ли речь о примитивном типе, или об объекте, может быть преобразован в другой тип. Напомним, что примитивными типами данных в JS являются Number, String, Boolean, Null, Undefined.

Существует 3 варианта преобразования:

  • В String
  • В Number
  • В Boolean

И несколько правил того как это происходит:

Преобразование в String , когда вы используете оператор конкатенации строк.

Напомню, что у нас знак + отвечает за оператора: — Конкатенация строк — Арифметическое сложение

Вполне естественно, что оператор + считается оператором конкатенации, если один из операндов является строкой.

Как преобразовываются примитивы в String :

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

По этому пункту есть интересный момент с тем, что неявное преобразование к Boolean , происходят фоном если мы используем конструкцию if/else или логические операторы || , && , ! .

Как преобразовываются примитивы в Boolean :

Преобразование к Number

Здесь правила более объемные, давайте по пунктам:

  • Операторы сравнения (>, <, <=, >=).
  • Побитовые операторы (|, &, ^,

Типы данных — Основы JavaScript

Что произойдет, если мы попробуем умножить число на строку? JavaScript вернет NaN (не число) — то самое значение. Оно возникает там, где вместе используются несовместимые значения. В данном случае число и строка:

Внутри высокоуровневых языков программирования данные разделяются по типам. Любая строка относится к типу String, а числа — к типу Number и BigInt (очень большие числа). Зачем нужны типы? Для защиты программы от трудноуловимых ошибок. Типы определяют две вещи:

  • Возможные (допустимые) значения. Например, числа в JavaScript делятся на два типа: Number и BigInt. Первые — это все числа ниже определенного порога (его можно посмотреть), вторые — выше. Такое разделение связано с техническими особенностями работы аппаратуры.
  • Набор операций, которые можно выполнять над этим типом. Например, операция умножения имеет смысл для типа «целые числа». Но не имеет смысла для типа «строки»: умножать слово «мама» на слово «блокнот» — бессмыслица.

JavaScript ведет себя двояко, когда встречается с нарушениями. В некоторых ситуациях он ругается на недопустимость операции и завершается с ошибкой. В других — программа продолжает работать. В этом случае недопустимая операция возвращает что-то похожее на NaN , как в примере выше.

Каким образом JavaScript понимает, что за тип данных перед ним? Достаточно просто. Любое значение где-то инициализируется и, в зависимости от способа инициализации, становится понятно, что перед нами. Например, числа — это просто числа без дополнительных символов, кроме точки для рациональных чисел. А вот строки всегда ограничены специальными символами (в JavaScript три разных варианта). Например, такое значение '234' – строка, несмотря на то, что внутри нее записаны цифры.

JavaScript позволяет узнать тип данных с помощью оператора typeof :

Типы данных Number, BigInt и String — это примитивные типы. Но есть и другие. В JavaScript встроен составной тип Object (а на его базе массивы, даты и другие). С его помощью можно объединять данные разных типов в одно значение, например, мы можем создать пользователя, добавив к нему имя и возраст:

По-английски строки в программировании называются "strings", а строчки текстовых файлов — "lines". Например, в коде выше есть две строчки (lines), но только одна строка (string). В русском иногда может быть путаница, поэтому во всех уроках мы будем говорить строка для обозначения типа данных «строка», и строчка для обозначения строчек (lines) в файлах.

undefined

Объявление переменных возможно и без указания конкретного значения. Что будет выведено на экран, если ее распечатать:

На экране появится undefined , специальное значение особого типа, которое означает отсутствие значения. Undefined активно используется самим JavaScript в самых разных ситуациях, например, при обращении к несуществующему символу строки:

Смысл (семантика) значения undefined именно в том, что значения нет. Однако, ничто не мешает написать такой код:

И хотя интерпретатор позволяет такое сделать, это нарушение семантики значения undefined , ведь в этом коде выполняется присваивание, а значит — подставляется значение.

JavaScript — один из немногих языков, в которых в явном виде присутствует понятие undefined . В остальных языках его функцию выполняет значение null , которое, кстати, тоже есть в JavaScript.

Вопрос на самопроверку. Почему нельзя объявить константу без указания значения?

Числа с плавающей точкой

В математике существуют разные виды чисел, например, натуральные – это целые числа от одного и больше, или рациональные – это числа с точкой, например 0.5. С точки зрения устройства компьютеров, между этими видами чисел – пропасть. Попробуйте ответить на простой вопрос, сколько будет 0.2 + 0.1? А теперь посмотрим, что на это скажет JavaScript:

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

Рациональные числа не выстроены в непрерывную цепочку, между 0.1 и 0.2 бесконечное множество чисел. Соответственно возникает серьезная проблема, а как хранить рациональные числа? Это интересный вопрос сам по себе. В интернете множество статей, посвященных организации памяти в таких случаях. Более того, существует стандарт, в котором описано, как это делать правильно, и подавляющее число языков на него опирается.

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

Явное преобразование типов

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

parseInt() — это функция, в которую передается значение, чтобы его преобразовать. Функция ведет себя подобно арифметическим операциям, но делает особые действия. Вот еще несколько примеров:

Точно так же можно преобразовать строку в число с плавающей точкой с помощью parseFloat() :

Типы данных, преобразование типов

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

В процессе работы компьютерные программы манипулируют значениями, такими как число 3,14 или текст «Hello World». Типы значений, которые могут бытпредставлены и обработаны в языке программирования, известны как типы данных, и одной из наиболее фундаментальных характеристик любого языка программирования является поддерживаемый им набор типов данных.

Типы данных в JavaScript можно разделить на три категории: простые(примитивы), объект с его подтипами, и ECMAScript specification types(EST).

2. Примитивы

К категории примитивов в языке JavaScript относятся:

2.1 Числа

В отличие от многих языков программирования, в JavaScript не делается различий между целыми и вещественными значениями. Все числа в JavaScript представляются вещественными значениями (с плавающей точкой). Для представления чисел в JavaScript используется 64-битный формат, определяемый стандартом IEEE 754.

Обратите внимание, что любому числовому литералу может предшествовать знак «минус» (-), делающий числа отрицательными. Однако фактически минус представляет собой унарный оператор смены знака, не являющийся частью синтаксиса числовых литералов.

2.1.1 Числовые литералы

В JavaScript есть 4 числовых литералов:

Двоичный литерал с целыми числами

Восьмеричный целочисленный литерал

Шестнадцатеричный целочисленный литерал

2.1.2 Специальные числа

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

  • Infinity
  • -Infinity
  • NaN
2.1.2 NaN

Если математическая операция не может быть совершена, то возвращается специальное значение NaN (Not-A-Number).

Например, деление 0/0 в математическом смысле неопределено, поэтому его результат NaN.

Значение NaN используется для обозначения математической ошибки и обладает следующими свойствами:

Значение NaN – единственное, в своем роде, которое не равно ничему, включая себя.

Значение NaN можно проверить специальной функцией isNaN(n), которая преобразует аргумент к числу и возвращает true.

Значение NaN «прилипчиво». Любая операция с NaN возвращает NaN.

Никакие математические операции в JavaScript не могут привести к ошибке или «обрушить» программу. В худшем случае, результат будет NaN.

2.1.3 Infinity

Infinity – особенное численное значение, которое ведет себя в точности как математическая бесконечность ∞.

2.1.4 Проверка на число

Глобальная isFinite() функция определяет, является ли переданное значение конечным числом. Если необходимо, параметр сначала преобразуется в число.

2.1.5 Методы объекта Number
<Number>.toPrecision()

Метод toPrecision() возвращает строку, представляющую объект Number с указанной точностью.

<Number>.toLocaleString()

Метод toLocaleString() возвращает строку с языко-зависимым представлением числа.

<Number>.toExponential

Метод toExponential() возвращает строку, представляющую объект Number в экспоненциальной записи.

<Number>.toFixed()

Метод toFixed() форматирует число, используя запись с фиксированной запятой.

2.2 Строки

Следующий базовый тип данных – строки. Строка – это неизменяемая, упорядоченная последовательность 16-битных значений, каждое из которых обычно представляет символ Юникода. Строки в JavaScript являются типом данных, используемым для представления текста. Длина строки – это количество 16-битных значений, содержащихся в ней. Нумерация символов в строках (и элементов в массивах) в языке JavaScript начинается с нуля: первое 16-битное значение находится в позиции 0, второе – в позиции 1 и т.д. Они используются для хранения текста. Записываются они в строковых литералах:

В ECMAScript 3 строковые литералы должны записываться в одной строке программы и не могут разбиваться на две строки. Однако в ECMAScript 5 строковые литералы можно разбивать на несколько строк, заканчивая каждую строку, кроме последней, символом обратного слэша (\). Ни один из символов обратного слэша, как и следующие за ними символы перевода строки, не будут включены в строковый литерал.

2.2.1 Экранирование символов

Если строка в одинарных кавычках, то внутренние одинарные кавычки внутри должны быть экранированы, то есть снабжены обратным слешем \’, вот так:

2.2.2 Экранирование символов

Строки могут содержать специальные символы. Самый часто используемый из таких символов – это «перевод строки».

Есть и более редкие символы, вот их список:

  • \b
  • \t
  • \n
  • \v
  • \f
  • \r
  • \\
  • \’
2.3 Логические значения

Логическое значение говорит об истинности или ложности чего-то. Логический тип данных имеет только два допустимых логических значения. Эти два значения представлены литералами true и false.

2.4 Cпециальный тип Null

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

2.5 Cпециальный тип undefined

В языке JavaScript имеется еще одно значение, свидетельствующее об отсутствии значения. Значение undefined, указывающее на полное отсутствие какого-либо значения. Оно возвращается при обращении к переменной, которой никогда не присваивалось значение, а также к несуществующему свойству объекта или элементу массива. Кроме того, значение undefined возвращается функциями, не имеющими возвращаемого значения, и присваивается параметрам функций для аргументов, которые не были переданы при вызове.

Идентификатор undefined является именем предопределенной глобальной переменной (а не ключевым словом, как null), которая инициализирована значением undefined. В ECMAScript 3 undefined является переменной, доступной для чтения/записи, которой можно присвоить любое другое значение. Эта проблема была исправлена в ECMAScript 5, и в реализациях JavaScript, соответствующих этому стандарту, переменная undefined доступна только для чтения.

Значение undefined можно рассматривать как признак неожиданного или ошибоч ного отсутствия какого-либо значения, а null – как признак обычного или вполне ожидаемого отсутствия значения. Если в программе потребуется присвоить одно из этих значений переменной или свойству или передать одно из этих значений функции, практически всегда предпочтительнее использовать значение null.

2.6 Cпециальный тип Symbol

Символы – новый примитивный тип, предназначенный для уникальных идентификаторов.

Основная область использования символов – это системные свойства объектов, которые задают разные аспекты их поведения. Поддержка у них пока небольшая, но она растёт. Системные символы позволяют разработчикам стандарта добавлять новые «особые» свойства объектов, при этом не резервируя соответствующие строковые значения.

3. Оператор typeof

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

У оператор typeof есть два синтаксиса: со скобками и без:

Работают они одинаково, но первый синтаксис короче.

4. Объектный тип данных

Объекты в языке JavaScript являются составными значениями(структурами): они представляют собой коллекции свойств, или именованных значений.

Объявляются объекты при помощи объектного литерала <>:

Свойство объекта так же также называют полем объекта. Поле объекта может хранить любой тип данных, включая функции, у таких свойст есть специальное название — метод.

Задать поле объекта можна через синтаксис ключ-значение внутри литерала объекта.

А получить доступ к полю можна с помощью такого синтаксиса:

5. Иммутабельность примитивов и ссылочность объектного типа

Между простыми значениями (undefined, null, boolean, числами, строками, символами) и объектами (включая массивы и функции) в языке JavaScript имеются фундаментальные отличия. Простые значения являются неизменяемыми (иммутабельными).

Простое значение невозможно изменить (трансформировать/модифицировать). Это очевидно для чисел и логических значений – нет никакого смысла изменять значение числа. Однако для строк это менее очевидно. Поскольку строки являются массивами символов, вполне естественно было бы ожидать наличие возможности изменять символы в той или иной позиции в строке. В действительности JavaScript не позволяет сделать это, и все строковые методы, которые, на первый взгляд, возвращают измененную строку, на самом деле возвращают новое строковое значение Например:

Кроме того, величины простых типов сравниваются по значению: две величины считаются одинаковыми, если они имеют одно и то же значение. Для чисел, логических значений, null и undefined это выглядит очевидным: нет никакого другого способа сравнить их. Однако для строк это утверждение не выглядит таким очевидным. При сравнении двух строковых значений JavaScript считает их одинаковыми тогда и только тогда, когда они имеют одинаковую длину и содержат одинаковые символы в соответствующих позициях.

Объекты отличаются от простых типов. Во-первых, они являются изменяемы­ми – их значения можно изменять:

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

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

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

Болие детально особенности объектного типа мы рассмотрим в последующих главах курса.

*. Упражнения

1. User

Создайте пустой объект user. Добавьте свойство name со значением Вася. Добавьте свойство surname со значением Петров. Поменяйте значение name на Сергей. Удалите свойство name из объекта.

Типы данных

Значение в JavaScript всегда относится к данным определённого типа. Например, это может быть строка или число.

Есть восемь основных типов данных в JavaScript. В этой главе мы рассмотрим их в общем, а в следующих главах поговорим подробнее о каждом.

Переменная в JavaScript может содержать любые данные. В один момент там может быть строка, а в другой – число:

Языки программирования, в которых такое возможно, называются «динамически типизированными». Это значит, что типы данных есть, но переменные не привязаны ни к одному из них.

Число

Числовой тип данных ( number ) представляет как целочисленные значения, так и числа с плавающей точкой.

Существует множество операций для чисел, например, умножение * , деление / , сложение + , вычитание — и так далее.

Кроме обычных чисел, существуют так называемые «специальные числовые значения», которые относятся к этому типу данных: Infinity , -Infinity и NaN .

Infinity представляет собой математическую бесконечность ∞. Это особое значение, которое больше любого числа.

Мы можем получить его в результате деления на ноль:

Или задать его явно:

NaN означает вычислительную ошибку. Это результат неправильной или неопределённой математической операции, например:

Значение NaN «прилипчиво». Любая математическая операция с NaN возвращает NaN :

Если где-то в математическом выражении есть NaN , то оно распространяется на весь результат (есть только одно исключение: NaN ** 0 равно 1 ).

Математические операции в JavaScript «безопасны». Мы можем делать что угодно: делить на ноль, обращаться с нечисловыми строками как с числами и т.д.

Скрипт никогда не остановится с фатальной ошибкой (не «умрёт»). В худшем случае мы получим NaN как результат выполнения.

Специальные числовые значения относятся к типу «число». Конечно, это не числа в привычном значении этого слова.

Подробнее о работе с числами мы поговорим в главе Числа.

BigInt

В JavaScript тип number не может безопасно работать с числами, большими, чем (2 53 -1) (т. е. 9007199254740991 ) или меньшими, чем -(2 53 -1) для отрицательных чисел. Технически, тип number может хранить и гораздо большие значения (вплоть до 1.7976931348623157 * 10 308 ), однако за пределами безопасного диапазона ±(2 53 -1) многие из чисел не могут быть представлены с помощью этого типа данных из-за ограничений, вызванных внутренним представлением чисел в двоичной форме. Например, нечётные числа, большие, чем (2 53 -1) , невозможно хранить при помощи типа number , они с разной точностью будут автоматически округляться до чётных значений. В то же время некоторые чётные числа, большие, чем (2 53 -1) , при помощи типа number хранить технически возможно (однако не стоит этого делать во избежание дальнейших ошибок).

Для большинства случаев достаточно безопасного диапазона чисел от -(2 53 -1) до (2 53 -1) . Но иногда нам нужен диапазон действительно гигантских целых чисел без каких-либо ограничений или пропущенных значений внутри него. Например, в криптографии или при использовании метки времени («timestamp») с микросекундами.

Тип BigInt был добавлен в JavaScript, чтобы дать возможность работать с целыми числами произвольной длины.

Чтобы создать значение типа BigInt , необходимо добавить n в конец числового литерала:

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

В данный момент BigInt поддерживается только в браузерах Firefox, Chrome, Edge и Safari, но не поддерживается в IE.

Строка

Строка ( string ) в JavaScript должна быть заключена в кавычки.

В JavaScript существует три типа кавычек.

  1. Двойные кавычки: "Привет" .
  2. Одинарные кавычки: ‘Привет’ .
  3. Обратные кавычки: `Привет` .

Двойные или одинарные кавычки являются «простыми», между ними нет разницы в JavaScript.

Обратные же кавычки имеют расширенную функциональность. Они позволяют нам встраивать выражения в строку, заключая их в $ <…>. Например:

Выражение внутри $ <…>вычисляется, и его результат становится частью строки. Мы можем положить туда всё, что угодно: переменную name , или выражение 1 + 2 , или что-то более сложное.

Обратите внимание, что это можно делать только в обратных кавычках. Другие кавычки не имеют такой функциональности встраивания!

Мы рассмотрим строки более подробно в главе Строки.

В некоторых языках, например C и Java, для хранения одного символа, например "a" или "%" , существует отдельный тип. В языках C и Java это char .

В JavaScript подобного типа нет, есть только тип string . Строка может содержать ноль символов (быть пустой), один символ или множество.

Булевый (логический) тип

Булевый тип ( boolean ) может принимать только два значения: true (истина) и false (ложь).

Такой тип, как правило, используется для хранения значений да/нет: true значит «да, правильно», а false значит «нет, не правильно».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *