Типы javascript: Восемь типов данных, typeof
Содержание
Переменные и типы данных в Javascript
В этом видео мы с вами разберем что такое переменные в Javascript. Итак зачем вообще нужны переменные в программировании? Представьте себе, что переменная это хранилище. Это то, как компьютер запоминает что либо. При создании переменной она помещается в память компьютера и он ее запоминает. Именно поэтому мы можем использовать переменные позже. Так как компьютер их помнит.
В javascript для создания переменных служит служебное слово var. Поэтому базовый пример создания переменной выглядит так
var day
Мы создали переменную день и теперь компьютер ее помнит. Мы может позже изменить ее присвоив переменной какой-то значение. То есть ниже мы можем написать
day = 1
Равно — это один из операторов и он служит для присвоения значения в переменную.
Также мы можем сразу создавая переменную записать в нее значение. Это будет выглядеть так.
var basicValue = 12345
В Javascript есть три базовых типа данных. И с одним из них мы уже успели познакомиться. Это Number. То есть число. Когда мы написали
var basicValue = 12345
Этим самым мы присвоили в переменную число.
Второй тип данных, который очень часто используется это строки. Когда мы пишем строки мы обязаны брать их в кавычки. И тогда выглядит это так
var someText = 'Hello world'
Мы создали переменную someText и записали в нее строку Hello world.
И третий тип данных это Boolean. Этот тип бывает только двух значений true или false.
var gameOver = true
Boolean очень часто используется для все возможных проверок на да/нет. Например закончилась ли игра, залогинен ли юзер и так далее.
При создании переменных есть кое-какие ограничения, которые нужно помнить.
Имя переменной может начинаться только с букв или нижнего подчеркивания. Это значит вы НЕ можете написать так
var 123Value = true
Этот код просто не будет работать.
В Javascript есть соглашение о именовании переменных. Вы не обязаны следовать ему, но это сделает ваш код более читабельным. Просто когда ваша переменная состоит из нескольких слов, то каждое следующее слово начинайте с большой буквы. Это выглядит так
var isLoggedIn = true
первое слово не нужно начинать с большой буквы. По английски это называется camelCase. Если же у вас переменная состоит из одного слова, то мы просто пишем ее маленькими буквами.
var name = 'Alex'
Также нужно помнить, что переменные зависимы от регистра. Это значит что
var isLoggedIn = true
var isloggedin = true
это абсолютно разные переменные.
Давайте же сделаем хоть что-то с этими переменными, которые мы насоздавали.
Для того, чтобы вывести переменную на экран мы можем воспрользоваться все той же записью
document.write()
и передать в нее вместо строки нашу переменную
document. write(someText)
Как мы видим, у нас вывелась наша переменная на экран.
Если у вас возникли какие-то вопросы или комментарии, пишите их прямо под этим видео.
Типы данных | Учебник JavaScript
JavaScript типы данных
Переменные JavaScript могут содержать множество типов данных: числа, строки, объекты и многое другое:
var length = 16; // Числа
var lastName = «Щипунов»; // Строки
var
x = {firstName:»Щипунов», lastName:»Андрей»}; // Объект
Понятие типов данных
В программировании типы данных — важное понятие.
Чтобы иметь возможность работать с переменными, важно кое-что знать о типе.
Без типов данных компьютер не может безопасно решить эту проблему:
var x = 16 + «Вольво»;
Есть ли смысл добавлять «Вольво» к шестнадцати? Произойдет ли ошибка или результат?
JavaScript будет рассматривать приведенный выше пример как:
var x =
«16» + «Вольво»;
При добавлении числа и строки JavaScript будет рассматривать число как строку.
JavaScript оценивает выражения слева направо. Различные последовательности могут давать разные результаты:
В первом примере JavaScript обрабатывает 16 и 4 как числа, пока не достигнет «Вольво».
Во втором примере, поскольку первый операнд является строкой, все операнды рассматриваются как строки.
Типы JavaScript являются динамическими
В JavaScript есть динамические типы. Это означает,
что одна и та же переменная может использоваться для хранения разных типов данных:
Пример
var x; // Теперь x не определен
x = 5; // Теперь x — это число
x = «Щипунов»; // Теперь x — это строка
Попробуйте сами »
Строки JavaScript
Строка (или текстовая строка) — это последовательность символов, например «Щипунов Андрей».
Строки пишутся в кавычках. Вы можете использовать одинарные или двойные кавычки:
Пример
var
carName1 = «Вольво XC60»; // Использование двойных кавычек
var
carName2 = ‘Вольво XC60’; // Использование одинарных кавычек
Попробуйте сами »
Вы можете использовать кавычки внутри строки, если они не соответствуют кавычкам, окружающим строку:
Пример
var answer1 = «Все’ в порядке»;
// Одинарная кавычка внутри двойных кавычек
var answer2 = «Его фамилия ‘Щипунов'»;
// Одинарные кавычки внутри двойных кавычек
var answer3 = ‘Его фамилия «Щипунов»‘;
// Двойные кавычки внутри одинарных кавычек
Попробуйте сами »
Позже в этом руководстве вы узнаете больше о строках.
Числа JavaScript
В JavaScript есть только один тип чисел.
Числа можно записывать с десятичными знаками или без них::
Пример
var x1 = 34.00; // Написано c десятичными знаками
var x2 = 34; // Написано без десятичных знаков
Попробуйте сами »
Сверхбольшие или сверхмалые числа можно записать в экспоненциальной нотации:
Вы узнаете больше о числах позже в этом руководстве.
Логические значения JavaScript
Логические значения могут иметь только два значения: true
или false
.
Пример
var x = 5;
var y = 5;
var z = 6;
(x == y)
// Возвращает true
(x == z) // Возвращает
false
Попробуйте сами »
Логические значения часто используются в условном тестировании.
Вы узнаете больше об условном тестировании позже в этом руководстве.
Массивы JavaScript
Массивы JavaScript записываются в квадратные скобки.
Элементы массива разделяются запятыми.
Следующий код объявляет (создает) вызываемый массив cars
,
содержащий три элемента (названия автомобилей):
Индексы массивов отсчитываются от нуля, что означает, что первый элемент — [0], второй — [1] и т.д.
Вы узнаете больше о массивах позже в этом руководстве.
Объекты JavaScript
Объекты JavaScript записываются в фигурные скобки {}
.
Свойства объекта записываются в виде пар «имя:значение», разделенных запятыми.
Объект (человек) в приведенном выше примере имеет 4 свойства: firstName, lastName, age и eyeColor.
Вы узнаете больше об объектах позже в этом руководстве.
Оператор typeof
Вы можете использовать typeof
оператор JavaScript, чтобы найти тип переменной JavaScript.
Оператор typeof
возвращает тип переменной или выражением:
Пример
typeof «» // Возвращает
«строку»
typeof «Щипунов» // Возвращает
«строку»
typeof «Щипунов Андрей» // Возвращает
«строку»
Попробуйте сами »
Пример
typeof 0 // Возвращает
«число»
typeof 314 // Возвращает
«число»
typeof 3. 14 // Возвращает
«число»
typeof (3) // Возвращает
«число»
typeof (3 + 4) // Возвращает
«число»
Попробуйте сами »
Неопределеный
В JavaScript переменная без значения имеет значение undefined
.
Типа тоже есть undefined
.
Любую переменную можно очистить, установив для нее значение undefined
.
Типа тоже будет undefined
.
Пустые значения
Пустое значение тут ни при чем undefined
.
Пустая строка имеет как допустимое значение, так и тип.
Ноль
В JavaScript null
это значит «ничего». Предполагается, что этого не существует.
К сожалению, в JavaScript тип данных null
— это объект.
Вы можете считать это ошибкой в JavaScript, который typeof null
является объектом.
Так и должно быть null
.
Вы можете очистить объект, установив для него null
:
Пример
var person = {firstName:»Щипунов», lastName:»Андрей», age:50, eyeColor:»Зеленый»};
person = null; // Теперь значение равно null, но тип по-прежнему является объектом
Попробуйте сами »
Вы также можете очистить объект, установив для него undefined
:
Пример
var person = {firstName:»Щипунов», lastName:»Андрей», age:50, eyeColor:»Зеленый»};
person = undefined; // Теперь оба значения и тип не определен
Попробуйте сами »
Разница между неопределенным и нулевым
undefined
и null
имеют одинаковые значения, но разные по типу:
typeof undefined
// undefined
typeof null
// object
null === undefined
// false
null == undefined
// true
Попробуйте сами »
Примитивные данные
Примитивное значение данных — это одно простое значение данных без дополнительных свойств и методов.
Оператор typeof
может вернуть один из этих примитивных типов:
string
number
boolean
undefined
Пример
typeof «Щипунов» // Возвращает
«string»
typeof 3.14 // Возвращает
«number»
typeof true // Возвращает
«boolean»
typeof false // Возвращает «boolean»
typeof x
// Возвращает «undefined» (если x не имеет значения)
Попробуйте сами »
Комплексные данные
Оператор typeof
может возвращать одно из двух сложных типов:
typeof
возвращает оператор «object» для объектов, массивов, и нуля.
typeof
не возвращает оператор «object» для функций.
Пример
typeof {name:’Щипунов’, age:34} // Возвращает «object»
typeof [1,2,3,4]
// Возвращает «object» (не «array», см. примечание ниже)
typeof null // Возвращает
«object»
typeof function myFunc(){} // Возвращает «function»
Попробуйте сами »
В typeof
возвращает оператор
«object
» для массивов,
так как в массивах JavaScript являются объектами.
JavaScript Типы данных. Уроки для начинающих. W3Schools на русском
JavaScript Типы данных
Переменные JavaScript могут содержать множество типов данных: числа, строки, объекты и многое другое:
var length = 16; // Число
var lastName = «Johnson»; // Строка
var
x = {firstName:»John», lastName:»Doe»}; // Объект
Концепция типов данных
В программировании типы данных являются важной концепцией.
Чтобы иметь возможность работать с переменными, важно знать о типе данных.
Без типов данных компьютер не может безопасно решить эту проблему:
Есть ли смысл добавлять «Volvo» к шестнадцати? Это приведёт к ошибке или покажет результат?
JavaScript будет обрабатывать приведенный выше пример как:
При добавлении числа и строки JavaScript будет обрабатывать число как строку.
JavaScript определяет выражения слева направо. Разные последовательности могут давать разные результаты:
В первом примере JavaScript обрабатывает 16 и 4 как числа, пока не достигнет «Volvo».
Во втором примере, поскольку первый операнд является строкой, все операнды обрабатываются как строки.
JavaScript Типы являются динамическими
JavaScript имеет динамические типы. Это означает, что одна и та же переменная может использоваться для хранения разных типов данных (т.е. меняться при разных условиях):
Пример
var x; // Здесь x не определён
x = 5; // Здесь x является числом
x = «John»; // Здесь x является строкой
Попробуйте сами »
JavaScript Строки
Строка (или текстовая строка) представляет собой последовательность символов, например «John Doe».
Строки пишутся в кавычках. Вы можете использовать одинарные или двойные кавычки:
Пример
var
carName1 = «Volvo XC60»; // Использование двойных кавычек
var
carName2 = ‘Volvo XC60’; // Использование одинарных кавычек
Попробуйте сами »
Вы можете использовать кавычки внутри строки, если они не соответствуют кавычкам, окружающим строку:
Пример
var answer1 = «Все нормально»;
// Одинарная кавычка внутри двойных кавычек
var answer2 = ‘Его зовут ‘Johnny»;
// Одинарные кавычки внутри двойных кавычек
var answer3 = ‘Его зовут ‘Johnny»;
// Двойные кавычки внутри одинарных кавычек
Попробуйте сами »
Вы узнаете больше о строках позже в этом учебнике.
JavaScript Числа
JavaScript имеет только один тип чисел.
Числа могут быть написаны из или без десятичных знаков:
Пример
var x1 = 34.00; // Написано с десятичными знаками
var x2 = 34; // Написано без десятичных знаков
Попробуйте сами »
Очень большие или очень маленькие числа могут быть написаны с научной (экспоненциальной) нотацией:
Вы узнаете больше о числах позже в этом учебнике.
JavaScript Булевы (логические) значения
Булевых может быть только два значения: true
или false
(истина или ложь).
Пример
var x = 5;
var y = 5;
var z = 6;
(x == y)
// Возвращает true
(x == z) // Возвращает false
Попробуйте сами »
Булевы значения часто используются в условном тестировании.
Вы узнаете больше об условном тестировании позже в этом учебнике.
JavaScript Массивы (arrays)
JavaScript массивы пишутся в квадратных скобках.
Элементы массива разделяются запятыми.
Следующий код объявляет (создает) массив с именем cars
, содержащий три элемента (названия машин):
Индексы массива начинаются с нуля, что означает, что первый элемент равен [0], второй [1] и т.д.
Подробнее о массивах вы узнаете далее в этом учебнике.
JavaScript Объекты
JavaScript объекты пишутся с помощью фигурных скобок {}
.
Свойства объекта записываются в виде пар имя-значение, разделенных запятыми.
Объект (персона) в примере выше имеет 4 свойства: firstName, lastName, age и eyeColor.
Вы узнаете больше об объектах позже в этом учебнике.
Оператор typeof
Вы можете использовать оператор JavaScript typeof
чтобы найти тип JavaScript переменной.
Оператор typeof
возвращает тип переменной или выражения:
Пример
typeof «» // Возвращает
«string»
typeof «John» // Возвращает
«string»
typeof «John Doe» // Возвращает
«string»
Попробуйте сами »
Пример
typeof 0 // Возвращает
«number»
typeof 314 // Возвращает
«number»
typeof 3.14 // Возвращает
«number»
typeof (3) // Возвращает
«number»
typeof (3 + 4) // Возвращает
«number»
Попробуйте сами »
Undefined / неопределённое значение
В JavaScript переменная без значения имеет значение undefined
.
Тип также undefined
.
Любую переменную можно очистить, установив значение в undefined
.
Тип также будет undefined
.
Пустые значения
Пустое значение не имеет ничего общего с undefined
.
Пустая строка имеет допустимое значение и тип.
Null / Ноль
В JavaScript null
— это «ничто». Предполагается, что это нечто, чего не существует.
К сожалению, в JavaScript, тип данных null
является объектом.
Можно считать ошибкой в JavaScript, когда typeof null
является объектом. Он должен быть null
.
Объект можно очистить, установив его в null
:
Пример
var person = {firstName:»John», lastName:»Doe», age:50, eyeColor:»blue»};
person = null; // Теперь значение равно null, но тип по-прежнему является object
Попробуйте сами »
Также можно очистить объект, установив его undefined
:
Пример
var person = {firstName:»John», lastName:»Doe», age:50, eyeColor:»blue»};
person = undefined; // Теперь и значение, и тип не определены
Попробуйте сами »
Различия между Undefined и Null
undefined
и null
равноценны, но различаются по типу:
typeof undefined
// undefined
typeof null
// object
null === undefined
// false
null == undefined
// true
Попробуйте сами »
Примитивные данные
Примитивное значение данных — это одно простое значение данных без дополнительных свойств и методов.
Оператор typeof
может вернуть один из этих примитивных типов:
string
number
boolean
undefined
Пример
typeof «John» // Возвращает «string»
typeof 3.14 // Возвращает «number»
typeof true // Возвращает «boolean»
typeof false // Возвращает
«boolean»
typeof x
// Возвращает «undefined» (если х не имеет значения)
Попробуйте сами »
Комплексные данные
Оператор typeof
может вернуть один из двух сложных типов:
Оператор typeof
возвращает «object» для объектов, массивов и null.
Оператор typeof
не возвращает «object» для функций.
Пример
typeof {name:’John’, age:34} // Возвращает «object»
typeof [1,2,3,4]
// Возвращает «object» (не «массив», смотрите примечание выше)
typeof null // Возвращает «object»
typeof function myFunc(){} // Возвращает «function»
Попробуйте сами »
Оператор typeof
возвращает «object
» для массивов, потому что в JavaScript массивы являются объектами.
Новые неизменяемые типы данных JavaScript: записи и кортежи
На чтение 5 мин Просмотров 40 Опубликовано
Записи и кортежи — это новые неизменяемые типы данных JavaScript, которые в настоящее время находятся на этапе 2 процесса утверждения стандартов TC39. Они могут быть изменены и в настоящее время недоступны ни в одном браузере или во время выполнения, но рабочие реализации должны появиться в течение следующего года. Они помогают решить пару запутанных головоломок, с которыми сталкиваются программисты…
Постоянные изменения
Профессиональные JavaScripters скажут вам, что constлучше всего назначать переменные с помощью. Это делает переменные неизменными. Значения нельзя изменить, поэтому у вас будет меньше проблем.
К сожалению, constнеизменными становятся только примитивные значения (String, Number, BigInt, Boolean, Symbol и undefined). Вы не можете переназначить массив или объект, но значения и свойства, которые они содержат, можно изменить. Например:
const myArray = [1, 2, 3]; myArray[] = 99; myArray.push(42); console.log(myArray); myArray = 'change';
Аналогично для объектов:
const myObj = { a: 1, b: 2, c: 3 } myObj.a = 99; myObj.d = 42; console.log(myObj); myObj = 'change';
Object.freeze()Метод может помочь, но только мелкое замораживание применяется для непосредственных дочерних свойств объекта:
const myObj = { a: 1, b: 2, c: { v: 3 } } Object.freeze(myObj); myObj.a = 99; myObj.c.v = 99; console.log(myObj);
Поэтому трудно гарантировать, что функция намеренно или случайно не изменит значения, хранящиеся в массиве или объекте. Разработчики должны либо надеяться на лучшее, либо передавать клонированную версию переменной (что имеет свои проблемы).
Эквивалентное неравенство
Дальнейший хаос может возникнуть, когда разработчики попытаются произвести кажущиеся разумными сравнения объектов или массивов:
const str = 'my string'; console.log( str === 'mystring' ); const num = 123; console.log( num === 123 ); const arr = [1, 2, 3]; console.log( arr === [1, 2, 3] ); const obj = { a: 1 }; console.log( obj === { a: 1 } );
По значению можно сравнивать только примитивные типы. Объекты и массивы передаются и сравниваются по ссылке. Две переменные будут эквивалентны, только если они указывают на один и тот же элемент в памяти:
const a = [1, 2]; const b = a; b.push(3); console.log( a === b ); console. log( a );
Для глубокого сравнения двух объектов или массивов требуется функция рекурсивного сравнения для оценки каждого значения по очереди. Даже в этом случае вы можете столкнуться с проблемами с такими типами, как даты или функции, которые могут храниться по-разному.
Кортежи: неизменяемые структуры данных, подобные массивам
Кортежи — это глубоко неизменяемые структуры данных, подобные массивам. По сути, они представляют собой составные примитивные типы, идентифицируемые с помощью #модификатора перед синтаксисом нормального массива:
const t1 = #[1, 2, 3]; const t2 = #[1, 2, #[3, 4]];
В качестве альтернативы новый Tuple.from()метод может создать кортеж из массива:
const t3 = Tuple.from( [1, 2, 3] );
В отличие от стандартных массивов, кортежи должны удовлетворять следующим требованиям:
- У них не должно быть отверстийс неустановленными значениями. Например, #[1,,,4]неверно.
- Они должны устанавливать только примитивы, другие кортежи или записи. Типы, такие как массивы, объекты или функции, не разрешены:
const t4 = #[ new Date() ]; const t5 = #[1, 2, [3, 4]];
Поскольку кортежи являются примитивами, их можно глубоко сравнить по значению с другими кортежами:
const t6 = #[1, 2]; console.log( t6 === #[1, 2] );
Обратите внимание, что сравнения с использованием менее строгого ==оператора возможны, если кортеж содержит одно значение. Например:
const t7 = #[99]; console.log( t7 == #[99] ); console.log( t7 == 99 ); console.log( t7 == '99' ); console.log( t7 == [99] );
Записи: неизменяемые объектные структуры данных
Записи — это глубоко неизменяемые объектные структуры данных. Опять же, это составные примитивные типы, идентифицируемые с помощью #модификатора перед синтаксисом нормального объекта:
const r1 = #{ a: 1, b: 2 }; const r2 = #{ a: 1, b: #{ c: 2 }, d: #[ 3, 4 ] };
В качестве альтернативы новый Record()конструктор может создать запись из объекта:
const r3 = Record({ a: 1, b: 2 });
Или Record.fromEntries()метод может создать запись из серии пар значений массива или кортежа:
const r4 = Record.fromEntries([ ['a', 1], ['b', 2] ]);
В отличие от стандартных объектов, записи должны соответствовать следующим требованиям:
- Они должны использовать строковые имена свойств. Например, #{ Symbol(): 1 }неверно.
- Они должны устанавливать значения только с помощью примитивов, других кортежей или записей. Типы, такие как массивы, объекты или функции, не разрешены:
const r5 = #{ 'd': new Date() }; const r6 = #{ a: 1, b: { c: 2 } };
Записи можно глубоко сравнивать с другими записями, и порядок свойств не имеет значения:
const r7 = #{ a: 1, b: 2 }; console.log( r7 === #{ b: 2, a: 1 } );
Записи можно сравнивать только с другими записями, поэтому использование оператора ==или ===не имеет значения. Однако можно извлечь объект keys()и values()для конкретных сравнений. Например:
const r8 = #{ a: 99 }; console.log( Object.values(r8) == 99 );
Неизменяемые обновления
Кортежи и записи могут звучать как сложные термины информатики, но они, наконец, позволят надёжное неизменяемое хранение данных и сравнения в JavaScript.aScript.
Что такое TypeScript и как его использовать
TypeScript — это язык программирования, в котором исправлены многие недостатки JavaScript. Код на TypeScript выглядит почти так же, как и код на JS, и, если у вас есть опыт frontend-разработки, изучить TypeScript достаточно просто. Особенно учитывая, что вы можете писать JS-код прямо в TS-скриптах.
Код на TypeScript компилируется в JS и подходит для разработки любых проектов под любые браузеры — тем более что можно выбрать версию JS, в которую будет компилироваться код.
TypeScript — проект с открытым исходным кодом, поэтому он очень быстро развивается. Многое, что появляется в TS, позже переходит и в JavaScript: например, let и const, стрелочные функции и так далее.
Давайте разберём два главных преимущества TS перед JS.
Многие проблемы в JavaScript появляются из-за динамической типизации и в целом странного поведения типов данных:
В TypeScript типизация статическая, что избавляет от множества проблем. Есть числовой тип, строковый, логический и другие. Возможно описывать и свои типы данных, например, с помощью enum:
enum Direction { Up, Down, Left, Right, None } let d : Direction = Direction. Up;
И в JS, и в TS есть поддержка объектно-ориентированного программирования: классы, объекты, наследование. Однако TypeScript шагнул чуть дальше и использует больше возможностей ОПП. В том числе, например, интерфейсы:
interface IPost { id: number; text: string; } class Message implements IPost { id: number; text: string; senderId: number; recieverId: number; } class ArticleComment implements IPost { id: number; text: string; senderId: number; articleId: number; }
Другой большой плюс — модификаторы доступа. Их в TypeScript три: public, private и protected. Вот пример их использования:
class User { private id: number; private login: number; constructor(id: number, login: number) { this.id = id; this. login = login; } public GetId(): number { return this.id; } public get Login(): number { return this.login; } }
Также есть и другие возможности:
- определение полей в конструкторе;
- преобразование типов;
- абстрактные классы;
- обобщение и так далее.
В будущем всё это может появиться и в JavaScript, но браузеры начнут поддерживать такие возможности ещё очень нескоро.
Величины, типы и операторы — Выразительный Javascript
Под поверхностью машины движется программа. Без усилий, она расширяется и сжимается. Находясь в великой гармонии, электроны рассеиваются и собираются. Формы на мониторе – лишь рябь на воде. Суть остаётся скрытой внутри…
Мастер Юан-Ма, Книга программирования
В компьютерном мире есть только данные. Можно читать данные, изменять данные, создавать новые – но кроме данных ничего нет. Все данные хранятся как длинные последовательности бит, этим они сходны между собой.
Биты – это сущности с двумя состояниями, обычно описываемые как нули и единицы. В компьютере они живут в виде высоких и низких электрических зарядов, сильного или слабого сигнала, или блестящего и матового участка на поверхности CD. Каждая часть информации может быть представлена в виде последовательности нулей и единиц, то есть бит.
К примеру, номер 13. Вместо десятичной системы, состоящей из 10 цифр, у вас есть двоичная система с двумя цифрами. Значение каждой позиции числа удваивается при движении справа налево. Биты, составляющие число 13, вместе с их весами:
0 0 0 0 1 1 0 1
128 64 32 16 8 4 2 1
Получается двоичное число 00001101, или 8 + 4 + 1, что равно 13.
Представьте океан бит. Типичный современный компьютер хранит более 30 миллиардов бит в оперативной памяти. Постоянная память (жёсткий диск) обычно ещё на пару порядков объёмнее.
Чтобы работать с ними и не заблудиться, вы можете делить их на куски, представляющие единицы информации. В JavaScript эти куски называются величинами. Все они состоят из бит, но играют разные роли. У каждой величины есть тип, определяющий её роль. Всего есть шесть основных типов: числа, строки, булевые величины, объекты, функции и неопределённые величины.
Для создания величины вам нужно указать её имя. Это удобно. Вам не надо собирать стройматериалы или платить за них. Нужно просто позвать – и оп-па, готово. Они не создаются из воздуха – каждая величина где-то хранится, и если вы хотите использовать огромное их количество, у вас могут закончиться биты. К счастью, это только если они все нужны вам одновременно. Когда величина вам станет не нужна, она растворяется, и использованные ею биты поступают в переработку как стройматериал для новых величин.
В этой главе мы знакомимся с атомами программ JavaScript – простыми типами величин и операторами, которые к ним применимы.
Величины числовых типов, это – сюрприз – числа. В программе JavaScript они записываются как
Используйте эту запись в программе, и она вызовет к жизни в компьютерной памяти цепочку бит, представляющую число 13.
JavaScript использует фиксированное число бит (64) для хранения численных величин. Число величин, которые можно выразить при помощи 64 бит, ограничено – то есть и сами числа тоже ограничены. Для N десятичных цифр количество чисел, которые ими можно записать, равно 10 в степени N. Аналогично, 64 битами можно выразить 2 в 64 степени чисел. 15, гарантированно будут точными. Вычисления с дробями обычно нет. Так же, как число π (пи) нельзя представить точно при помощи конечного числа цифр, так и многие дроби нельзя представить в случае, когда у нас есть только 64 бита. Плохо, но это мешает в очень специфических случаях. Важно помнить об этом и относиться к дробям как к приближённым значениям.
Главное, что можно делать с числами – это арифметические вычисления. Сложения и умножения используют два числа и выдают третье. Как это записывается в JavaScript:
Символы + и * называются операторами. Первый – сложение, второй – умножение. Помещаем оператор между двумя величинами и получаем значение выражения.
А в примере получается «сложить 4 и 100 и затем умножить результат на 11», или умножение выполняется сначала? Как вы могли догадаться, умножение выполняется первым. Но как и в математике, это можно изменить при помощи скобок:
Для вычитания используется оператор -, а для деления — /
Когда операторы используются без скобок, порядок их выполнения определяется их приоритетом. У операторов * и / приоритет одинаковый, выше, чем у + и -, которые между собой равны по приоритету. При вычислении операторов с равным приоритетом они вычисляются слева направо:
вычисляется как (1 — 2) + 1
Пока беспокоиться о приоритетах не надо. Если сомневаетесь – используйте скобки.
Есть ещё один оператор, который вы не сразу узнаете. Символ % используется для получения остатка. X % Y – остаток от деления X на Y. 314 % 100 даёт 14, и 144 % 12 даёт 0. Приоритет у оператора такой же, как у умножения и деления. Математики для операции нахождения остатка от деления % могут использовать термин сравнение по модулю.
В JavaScript есть три специальных значения, которые считаются числами, но ведут себя не как обычные числа.
Это Infinity
и -Infinity
, которые представляют положительную и отрицательную бесконечности. Infinity — 1 = Infinity, и так далее. Не надейтесь сильно на вычисления с бесконечностями, они не слишком строгие.
Третье число: NaN
. Обозначает «not a number» (не число), хотя это величина числового типа. Вы можете получить её после вычислений типа 0 / 0, Infinity – Infinity, или других операций, которые не ведут к точным осмысленным результатам.
Следующий базовый тип данных – строки. Они используются для хранения текста. Записываются они в кавычках:
"Что посеешь, то из пруда"
'Баба с возу, потехе час'
Можно использовать как двойные, так и одинарные кавычки – главное использовать их вместе. Почти всё можно заключить в кавычки и сделать из этого строку. Но некоторые символы вызывают проблемы. Например, сложно заключить кавычки в кавычки. Перевод строки тоже нельзя просто так заключить в них – строка должна идти одной строкой.
Для заключения специальных символов используется обратный слеш \. Он обозначает, что символ, идущий за ним, имеет специальное значение – это называется «экранирование символов» (escape character). \” можно заключать в двойные кавычки. \n обозначает перевод строки, \t – табуляцию.
Строка “Между первой и второй\nсимвол будет небольшой” на самом деле будет выглядеть так:
Между первой и второй
символ будет небольшой
Если вам нужно включить в строку обратный слеш, его тоже нужно экранировать: \\. Инструкцию “Символ новой строки — это “\n”” нужно будет написать так:
"Символ новой строки – это \"\\n\""
Строки нельзя делить, умножать и складывать. Однако с ними можно использовать оператор +, который будет соединять их друг с другом. Следующее выражение выдаст слово «соединение»:
"сое" + "ди" + "н" + "ение"
Есть много способов манипуляций со строками, которые мы обсудим в главе 4.
Не все операторы записываются символами – некоторые словами. Один из таких операторов – typeof
, который выдаёт название типа величины, к которой он применяется.
console.log(typeof 4.5)
console.log(typeof "x")
Будем использовать вызов console.log
в примерах, когда захотим увидеть результат на экране. Как именно будет выдан результат – зависит от окружения, в котором вы запускаете скрипт.
Предыдущие операторы работали с двумя величинами, однако typeof использует только одну. Операторы, работающие с двумя величинами, называются бинарными, а с одной – унарными. Минус (вычитание) можно использовать и как унарный, и как бинарный.
Часто вам нужна величина, которая просто показывает одну из двух возможностей – типа «да» и «нет», или «вкл» и «выкл». Для этого в JavaScript есть тип Boolean, у которого есть всего два значения – true
и false
(правда и ложь).
Один из способов получить булевские величины:
console.log(3 > 2)
console.log(3 < 2)
Знаки < и > традиционно обозначают «меньше» и «больше». Это бинарные операторы. В результате их использования мы получаем булевскую величину, которая показывает, является ли неравенство верным.
Строки можно сравнивать так же:
console.log("Арбуз" < "Яблоко")
Строки сравниваются по алфавиту: буквы в верхнем регистре всегда «меньше» букв в нижнем регистре. Сравнение основано на стандарте Unicode. Этот стандарт присваивает номер практически любому символу из любого языка. Во время сравнения строк JavaScript проходит по их символам слева направо, сравнивая номерные коды этих символов.
Другие сходные операторы – это >= (больше или равно), <= (меньше или равно), == (равно), != (не равно).
console.log("Хочется" != "Колется")
В JavaScript есть только одна величина, которая не равна самой себе – NaN
(«не число»).
NaN – это результат любого бессмысленного вычисления, поэтому он не равен результату какого-то другого бессмысленного вычисления.
Есть операции, которые можно совершать и с самими булевскими значениями. JavaScript поддерживает три логических оператора: и, или, нет.
Оператор && — логическое «и». Он бинарный, и его результат – правда, только если обе величины, к которым он применяется, тоже правда.
console.log(true && false)
console.log(true && true)
Оператор || — логическое «или». Выдаёт true, если одна из величин true.
console.log(false || true)
console.log(false || false)
«Нет» записывается при помощи восклицательного знака: !. Это унарный оператор, который обращает данную величину на обратную. !true получается false, !false получается true.
При использовании логических и арифметических операторов не всегда ясно, когда нужны скобки. На практике вы можете справиться с этим, зная, что у || приоритет ниже всех, потом идёт &&, потом операторы сравнения, потом все остальные. Такой порядок был выбран для того, чтобы в выражениях типа следующего можно было использовать минимальное количество скобок:
1 + 1 == 2 && 10 * 10 > 50
Последний логический оператор не унарный и не бинарный – он тройной. Записывается при помощи вопросительного знака и двоеточия:
console.log(true ? 1 : 2);
console.log(false ? 1 : 2);
Это условный оператор, у которого величина слева от вопросительного знака выбирает одну из двух величин, разделённых двоеточием. Когда величина слева true, выбираем первое значение. Когда false, второе.
Существуют два специальных значения, null и undefined, которые используются для обозначения отсутствия осмысленного значения. Сами по себе они никакой информации не несут.
Много операторов, которые не выдают значения, возвращают undefined просто для того, чтобы что-то вернуть. Разница между undefined и null появилась в языке случайно, и обычно не имеет значения.
Ранее я упоминал, что JavaScript позволяет выполнять любые, подчас очень странные программы. К примеру:
console.log(8 * null)
console.log("5" - 1)
console.log("5" + 1)
console.log("пять" * 2)
console.log(false == 0)
Когда оператор применяется «не к тому» типу величин, JavaScript втихую преобразовывает величину к нужному типу, используя набор правил, которые не всегда соответствуют вашим ожиданиям. Это называется приведением типов (coercion). В первом выражении null превращается в 0, а “5” становится 5 (из строки – в число). Однако в третьем выражении + выполняет конкатенацию (объединение) строк, из-за чего 1 преобразовывается в “1” (из числа в строку).
Когда что-то неочевидное превращается в число (к примеру, “пять” или undefined), возвращается значение NaN. Последующие арифметические операции с NaN опять получают NaN. Если вы получили такое значение, поищите, где произошло случайное преобразование типов.
При сравнении величин одного типа через == легко предсказать, что вы должны получить true, если они одинаковые (исключая случай с NaN). Но когда типы различаются, JavaScript использует сложный и запутанный набор правил для сравнений. Обычно он пытается преобразовать тип одной из величин в тип другой. Когда с одной из сторон оператора возникает null или undefined, он выдаёт true только если обе стороны имеют значение null или undefined.
console.log(null == undefined);
console.log(null == 0);
Последний пример демонстрирует полезный приём. Когда вам надо проверить, имеет ли величина реальное значение вместо null или undefined, вы просто сравниваете её с null при помощи == или !=.
Но что, если вам надо сравнить нечто с точной величиной? Правила преобразования типов в булевские значения говорят, что 0, NaN и пустая строка “” считаются false, а все остальные – true. Поэтому 0 == false и “” == false. В случаях, когда вам не нужно автоматическое преобразование типов, можно использовать ещё два оператора: === и !==. Первый проверяет, что две величины абсолютно идентичны, второй – наоборот. И тогда сравнение “” === false возвращает false.
Рекомендую использовать трёхсимвольные операторы сравнения для защиты от неожиданных преобразований типов, которые могут привести к непредсказуемым последствиям. Если вы уверены, что типы сравниваемых величин будут совпадать, можно спокойно использовать короткие операторы.
Логические операторы && и || работают с величинами разных типов очень странным образом. Они преобразуют величину с левой стороны оператора в булевскую, чтобы понять, что делать дальше, но в зависимости от оператора и от результата этого преобразования, возвращают оригинальное значение либо левой, либо правой части.
К примеру, || вернёт значение с левой части, когда его можно преобразовать в true – а иначе вернёт правую часть.
console.log(null || "user")
console.log("Karl" || "user")
Такая работа оператора || позволяет использовать его как откат к значению по умолчанию. Если вы дадите ему выражение, которое может вернуть пустое значение слева, то значение справа будет служить заменой на этот случай.
Оператор && работает сходным образом, но наоборот. Если величина слева преобразовывается в false, он возвращает эту величину, а иначе – величину справа.
Ещё одно важное их свойство – выражение в правой части вычисляется только при необходимости. В случае true || X неважно, чему равно X. Даже если это какое-то ужасное выражение. Результат всегда true и X не вычисляется. Так же работает false && X – X просто игнорируется. Это называется коротким вычислением.
Оператор условия работает так же. Первое выражение всегда вычисляется, а из второго и третьего значения – только то, которое оказывается выбранным в результате.
Мы рассмотрели четыре типа величин JavaScript: числа, строки, булевские и неопределённые.
Эти величины получаются, когда мы пишем их имена (true, null) или значения (13, “ёпрст”). Их можно комбинировать и изменять при помощи операторов. Для арифметики есть бинарные операторы (+, -, *, / и %), объединение строк (+), сравнение (==, !=, ===, !==, <, >, <=, >=) и логические операторы (&&, ||), а также несколько унарных операторов (- для отрицательного значения, ! для логического отрицания и typeof для определения типа величины).
Эти знания позволяют использовать JavaScript в качестве калькулятора, но и только. В следующей главе мы будем связывать эти простые значения вместе, чтобы составлять простые программы.
Symbol — Глоссарий веб-документации MDN: Определения терминов, связанных с Интернетом
В JavaScript символ — это примитивное значение.
Значение, имеющее тип данных Символ , может называться «значением символа». В среде выполнения JavaScript значение символа создается путем вызова функции Symbol
, которая динамически создает анонимное уникальное значение. Символ может использоваться как свойство объекта.
Символ может иметь дополнительное описание, но только для целей отладки.
Символ Значение представляет собой уникальный идентификатор. Например:
let Sym1 = Symbol ("Sym")
let Sym2 = Symbol ("Sym")
console.log (Sym1 === Sym2)
Примечание: Если вы знакомы с Ruby (или другим языком), в котором также есть функция под названием «символы» , пожалуйста, не обманывайтесь. Символы JavaScript разные.
Тип Symbol — это новая функция в ECMAScript 2015. Для Symbol не существует эквивалента в ECMAScript 5.
В некоторых языках программирования символьный тип данных упоминается как «атом».
Символы не преобразуются автоматически в строки
Большинство значений в JavaScript поддерживают неявное преобразование в строку. Например, мы можем предупреждать
практически о любом значении, и это сработает. Символы особенные. Они не конвертируются автоматически.
Например:
let Sym = Symbol ("Сим")
предупреждение (сим)
Это «языковая защита» от путаницы, потому что строки и символы принципиально разные и не должны время от времени преобразовывать одно в другое.
Если вы действительно хотите показать символ, нам нужно вызвать для него .toString ()
.
let Sym = Symbol ("Сим")
предупреждение (Sym.toString ())
Или вы можете использовать свойство symbol .description
, чтобы получить его описание:
let _Sym = Symbol ("Sym");
предупреждение (_Sym.description);
Общеизвестные символы
Класс Symbol
имеет константы для так называемых хорошо известных символов .Эти символы позволяют вам настроить, как JS обрабатывает объект, используя их в качестве ключей свойств.
Примеры хорошо известных символов: Symbol. iterator
для объектов, подобных массиву, или Symbol.search
для строковых объектов.
Они перечислены в спецификации в таблице общеизвестных символов:
-
Обозначение. Имеет экземпляр
-
Symbol.isConcatSpreadable
-
Обозначение. Итератор
-
Обозначение.toPrimitive
- … и так далее.
Глобальный реестр символов
Существует глобальный реестр символов, содержащий все доступные символы. К реестру обращаются следующие методы: Symbol.for ()
и Symbol.keyFor ()
; они являются посредниками между глобальной таблицей символов (или «реестром») и средой выполнения. Глобальный реестр символов в основном создается инфраструктурой компилятора JavaScript, а содержимое глобального реестра символов недоступно для инфраструктуры времени выполнения JavaScript, кроме как через эти отражающие методы.
Метод Symbol. for ( tokenString )
возвращает значение символа из реестра, а Symbol.keyFor ( symbolValue )
возвращает строку токена из реестра; каждый является инверсным, поэтому следующее: истинно
:
Symbol.keyFor (Symbol.for ("tokenString")) === "tokenString"
Общие знания
typeof — JavaScript | MDN
Оператор typeof
возвращает строку, указывающую тип
неоцененного операнда.
За типом оператора
следует его операнд:
тип операнда
typeof (операнд)
Параметры
-
операнд
- Выражение, представляющее объект или примитив, тип которого должен быть возвращен.
В следующей таблице приведены возможные возвращаемые значения типа
. Для
дополнительную информацию о типах и примитивах см. также на странице структуры данных JavaScript.
Примечание: ECMAScript 2019 и более ранние разрешенные реализации должны иметь
typeof
возвращает любое строковое значение, определяемое реализацией, для невызываемого
нестандартные экзотические предметы.
Единственный известный браузер, который действительно воспользовался этим преимуществом, — это старый Интернет.
Explorer (см. Ниже).
Базовое использование
typeof 37 === 'число';
typeof 3.14 === 'число';
typeof (42) === 'число';
typeof Math.LN2 === 'число';
typeof Infinity === 'число';
typeof NaN === 'число';
typeof Number ('1') === 'число';
typeof Number ('башмак') === 'число';
typeof 42n === 'bigint';
typeof '' === 'строка';
typeof 'bla' === 'строка';
typeof `template literal` === 'строка';
typeof '1' === 'строка';
typeof (typeof 1) === 'строка';
typeof String (1) === 'строка';
typeof true === 'логическое';
typeof false === 'логическое';
typeof Boolean (1) === 'логический';
typeof !! (1) === 'логическое';
typeof Symbol () === 'символ'
typeof Symbol ('foo') === 'символ'
typeof Символ. итератор === 'символ'
typeof undefined === 'undefined';
typeof createdButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
typeof {a: 1} === 'объект';
typeof [1, 2, 4] === 'объект';
typeof new Date () === 'объект';
typeof / regex / === 'объект';
typeof new Boolean (true) === 'объект';
typeof new Number (1) === 'объект';
typeof new String ('abc') === 'объект';
typeof function () {} === 'функция';
typeof class C {} === 'функция';
typeof Math.sin === 'функция';
нулевой тип
typeof null === 'объект';
В первой реализации JavaScript значения JavaScript были представлены как тип
тег и значение.Тег типа для объектов был 0
. null
было
представлен как нулевой указатель ( 0x00
на большинстве платформ). Вследствие этого,
null
имел 0
в качестве тега типа, следовательно, type of
return
значение «объект»
. (ссылка)
Было предложено исправление для ECMAScript (через опцию), но оно было
отклоненный. Это привело бы к typeof null === 'null'
.
Использование
новый оператор
let str = new String ('Строка');
let num = новое число (100);
typeof str;
typeof num;
let func = new Function ();
typeof func;
Необходимость в круглых скобках в синтаксисе
пусть iData = 99;
typeof iData + 'Wisen';
typeof (iData + 'Wisen');
Регулярные выражения
Вызываемые регулярные выражения были нестандартным дополнением в некоторых браузерах.
typeof / s / === 'функция';
typeof / s / === 'объект';
Ошибки
До ECMAScript 2015 type of
всегда гарантированно возвращал строку
для любого операнда, с которым он был поставлен. Даже с необъявленными идентификаторами,
typeof
вернет undefined
. Использование типа
никогда не мог вызвать ошибку.
Однако, с добавлением с блочной областью видимости, пусть
и
const
, используя тип
на let
и
const
переменных (или с использованием типа
в классе
) в
блок до того, как они будут объявлены, вызовет ReferenceError
.Блокировать
переменные находятся во «временном
мертвая зона «от начала блока до обработки инициализации,
во время которого он выдаст ошибку при доступе.
typeof undeclaredVariable === 'undefined';
typeof newLetVariable;
typeof newConstVariable;
typeof newClass;
let newLetVariable;
const newConstVariable = 'привет';
class newClass {};
Исключения
Все текущие браузеры предоставляют нестандартный документ объекта хоста .все
с типом undefined
.
typeof document.all === 'undefined';
Хотя спецификация допускает теги нестандартного типа для нестандартных экзотических объектов, она
требует, чтобы эти теги типа отличались от предопределенных. Случай
document.all
, имеющий тип 'undefined'
, классифицирован в сети
стандартов как «умышленное нарушение» исходного стандарта ECMA JavaScript.
Использование в реальных условиях
type of
очень полезно, но не так универсально, как могло бы потребоваться.Для
Например, typeof ([])
, это 'object'
, а также
typeof (новая дата ())
, typeof (/ abc /)
и т. Д.
Для большей конкретности типов проверки, type of
wrapper для использования в
код производственного уровня будет следующим (при наличии obj
):
тип функции (obj, showFullClass) {
if (showFullClass && typeof obj === "объект") {
вернуть Object.prototype.toString.(массив | bigint | дата | ошибка | функция | генератор | регулярное выражение | символ) $ /)? deepType:
(typeof obj === 'объект' || typeof obj === 'function')? 'объект': typeof obj;
}
Для проверки несуществующих переменных, которые в противном случае
ReferenceError
, используйте тип nonExistentVar === 'undefined'
.
Таблицы BCD загружаются только в браузере
Примечания, относящиеся к IE
В IE 6, 7 и 8 многие объекты хоста являются объектами, а не функциями.Например:
typeof alert === 'объект'
Некоторые нестандартные свойства IE возвращают другие значения (tc39 / ecma262 # 1440
(комментарий)):
typeof window.external.AddSearchProvider === "неизвестно";
typeof window.external.IsSearchProviderInstalled === "неизвестно";
Типы данных JavaScript
Переменные JavaScript могут содержать разные типы данных: числа,
струны, предметы и др .:
пусть длина = 16; // Число
let lastName = «Johnson»; // Строка
let x = {firstName: «John», lastName: «Doe»}; // Объект
Концепция типов данных
В программировании типы данных — важное понятие.
Чтобы иметь возможность работать с переменными, важно знать кое-что о
тип.
Без типов данных компьютер не может безопасно решить эту проблему:
Есть ли смысл добавлять «Вольво» к шестнадцати? Произойдет ли это
ошибка или это даст результат?
JavaScript будет рассматривать приведенный выше пример как:
При добавлении числа и строки JavaScript обрабатывает число как
нить.
JavaScript оценивает выражения слева направо.Различные последовательности могут
дают разные результаты:
В первом примере JavaScript обрабатывает 16 и 4 как числа, пока не достигнет «Volvo».
Во втором примере, поскольку первый операнд является строкой, все операнды
рассматриваются как струны.
Типы JavaScript являются динамическими
JavaScript имеет динамические типы. Это означает, что можно использовать одну и ту же переменную.
держать
разные типы данных:
Пример
пусть x; // Теперь x не определено
x = 5; // Теперь x — это число
x = «John»; // Теперь x — строка
Пытаться
сам »
Строки JavaScript
Строка (или текстовая строка) — это последовательность символов, например «Джон Доу».
Строки заключаются в кавычки. Вы можете использовать одинарные или двойные кавычки:
Пример
let carName1 = «Volvo XC60»; // Использование двойных кавычек
let carName2 = ‘Volvo XC60’; // Использование одинарных кавычек
Пытаться
сам »
Вы можете использовать кавычки внутри строки, если они не соответствуют кавычкам.
окружающая строка:
Пример
let answer1 = «Все в порядке»;
// Одиночная кавычка внутри двойных кавычек
let answer2 = «Его зовут ‘Джонни'»;
// Одиночные кавычки внутри двойных
let answer3 = ‘Его зовут «Джонни»’;
// Двойные кавычки внутри одинарных кавычек
Пытаться
сам »
Вы узнаете больше о строках позже в этом
руководство.
Номера JavaScript
JavaScript имеет только один тип чисел.
Числа можно записывать с десятичными знаками или без них:
Пример
пусть x1 = 34.00; // Записывается с десятичными знаками
let x2 = 34; // Записывается без десятичных знаков
Пытаться
сам »
Очень большие или очень маленькие числа можно писать научными
(экспоненциальная) запись:
Пример
пусть y = 123e5; // 12300000
let z = 123e-5; // 0.00123
Пытаться
сам »
Вы узнаете больше о числах позже в этом
руководство.
Логические значения JavaScript
Логические значения могут иметь только два значения: true
или false
.
Пример
пусть x = 5;
пусть y = 5;
пусть z = 6;
(х == у)
// Возвращает истину
(x == z) // Возвращает
ложь
Попробуй сам »
Логические значения часто используются в условном тестировании.
Вы узнаете больше о
условное тестирование далее в этом руководстве.
Массивы JavaScript
Массивы JavaScript записываются в квадратные скобки.
Элементы массива разделяются запятыми.
Следующий код объявляет (создает) массив с именем cars
, содержащий три
Товаров (названий автомобилей):
Индексы массива отсчитываются от нуля, что означает, что первый элемент — [0], второй —
[1] и так далее.
Вы узнаете больше о массивах позже в этом руководстве.
Объекты JavaScript
Объекты JavaScript записываются в фигурные скобки {}
.
Объект
свойства записываются как пары имя: значение, разделенные запятыми.
Пример
const person = {firstName: «John», lastName: «Doe», возраст: 50, eyeColor: «blue»};
Попробуй сам »
Объект (человек) в приведенном выше примере имеет 4 свойства: firstName,
lastName, age и eyeColor.
Вы узнаете больше о объектах позже в этом руководстве.
Тип оператора
Вы можете использовать оператор JavaScript typeof
, чтобы найти тип
переменной JavaScript.
Оператор typeof
возвращает тип переменной или выражения:
Пример
typeof «» // Возвращает
«string»
typeof «John» // Возвращает
«string»
typeof «John Doe» // Возвращает
«строка»
Попробуй сам »
Пример
typeof 0 // возвращает
«number»
typeof 314 // Возвращает
«number»
typeof 3.14 // Возвращает
«number»
typeof (3) // Возвращает
«number»
typeof (3 + 4) // Возвращает
«номер»
Попробуй сам »
Вы узнаете больше о типе типа позже в этом руководстве.
Не определено
В JavaScript переменная без значения имеет значение undefined
.
Тип также undefined
.
Любую переменную можно очистить, установив значение undefined
.
Тип также будет undefined
.
Пример
car = undefined; // Значение не определено,
тип не определен
Попробуй сам »
Пустые значения
Пустое значение не имеет ничего общего с undefined
.
Пустая строка имеет как допустимое значение, так и тип.
Типы в JavaScript
Узнайте о примитивных типах в JavaScript, о том, как работает приведение типов, и о лучшем решении для работы с типами в JavaScript.
Все языки программирования имеют встроенные типы. Они являются строительными блоками, которые помогают нам структурировать наш код и создавать новые приложения, фреймворки, библиотеки и т. Д. Кроме того, эти встроенные типы различаются от одного языка к другому.У нас разные языки для разных целей; у каждого языка свой способ программирования, и он используется для конкретного случая использования.
Изучение языка программирования — непростая задача. Когда вы уже знаете, как программировать на каком-либо языке, и хотите выучить другой язык, это тоже непростая задача. Пути и концепции, которые вы запомнили из своего предыдущего и основного языка программирования, могут помешать вашему процессу изучения нового.
JavaScript стал наиболее часто используемым языком программирования в мире по нескольким причинам.Одним из наиболее важных факторов, которые мы можем перечислить, является то, что с JavaScript очень легко начать работу. Новички могут начать писать код JavaScript без особых хлопот. Для разработчиков, которые уже имеют опыт работы с другим языком программирования, JavaScript становится проще и превращается в язык, где возможно все.
Динамическая и статическая
Есть два основных различия между динамически типизированными и статически типизированными языками:
- Языки с динамической типизацией выполняют проверку типов во время выполнения.
- Языки со статической типизацией выполняют проверку типов во время компиляции.
Языки со статической типизацией требуют, чтобы вы объявили типов данных ваших переменных. Если вы когда-либо использовали Java или любой другой язык со статической типизацией, вы знаете, что мы должны сначала объявить тип нашей переменной, например:
int time = 10;
char name = 'Леонардо';
Если мы не укажем тип данных переменной на нашем языке со статической типизацией, это вызовет ошибку.В этом примере мы просто определили тип данных времени как int
и имя как char
.
Еще одна причина, по которой JavaScript стал настолько известным во всем мире, заключается в том, что это язык с динамической и слабой типизацией одновременно. Слабо типизированный язык — это язык, в котором переменные не обязательно должны быть привязаны к определенному типу данных.
Это очень простой, гибкий, забавный, а иногда и непростой язык программирования. В языках с динамической типизацией, таких как JavaScript, нам не нужно указывать типы данных наших переменных.
const time = 10;
const name = 'Леонардо';
Языки с динамической типизацией могут компилировать ваш код, даже если есть ошибки, которые могут привести к сбою вашего приложения и возникновению проблем с его работой. Статически типизированные языки не позволят компилировать, пока все ошибки вашего кода не будут исправлены.
Языки с динамической типизацией очень гибкие и определенно могут сэкономить нам много времени при написании наших приложений. Код легче понять, мы можем быстрее создавать и т. Д.
За гибкость, иногда языки с динамической типизацией, такие как JavaScript, могут приводить к некоторым ошибкам во время выполнения, которые мы сначала не улавливаем.
3 - 1
3 + 1
'3' - 1
'3' + 1
У нас буквально есть большой репозиторий GitHub под названием wtfjs с множеством разных странных и хитрых ошибок в JavaScript.
Точное знание того, как работают все примитивные типы JavaScript, необходимо для предотвращения этих сложных ошибок в ваших приложениях.
Примитивные типы
JavaScript — это, по сути, язык с динамической типизацией. Иногда может показаться, что в JavaScript нет типов, и это в корне неверно.
Когда мы говорим о типах в JavaScript, это может означать совсем другое, чем когда мы говорим о типах в статически типизированных языках.
Тип предоставляет набор значений, из которых выражение может принимать свои значения, а в JavaScript у нас есть несколько примитивных типов:
- строка
- номер
- undefined
- null
- логический
- символ
Эти примитивные типы являются строительными блоками JavaScript — они лежат в основе всех наших приложений.
Все, что не является примитивным типом в JavaScript, является объектом. Вопреки мнению многих, объекты в JavaScript не являются примитивными типами. Мы можем перечислить множество различий между примитивными типами и объектами, но одним из наиболее важных является то, что примитивные типы неизменяемы, а объект может иметь только неизменяемую ссылку, а их значения могут изменяться со временем.
Каждый разработчик JavaScript должен хотя бы немного знать, как работает каждый примитивный тип и его внутреннее поведение.Это поможет вам познакомиться со всеми различными типами, которые есть в языке, и когда правильно использовать каждый примитивный тип.
Одна из причин, по которой у нас может быть много ошибок в JavaScript, заключается в том, что, поскольку язык является одновременно динамически и слабо типизированным языком, трудно предсказать и гарантировать тип переменной. Каждый раз, когда мы пытаемся получить значение чего-либо, оно могло измениться, как и тип данных.
Тип принуждения
Приведение типов — это процесс в JavaScript преобразования значения из одного типа в другой.Любой тип в JavaScript, примитив или объект, может быть преобразован в другой тип.
Это одна из причин, почему иногда JavaScript может быть таким сложным. Мы используем переменную и по ошибке можем изменить тип данных этой переменной на другой, не заметив этого.
Существует два типа приведения типов: неявное и явное .
Представьте, что у вас есть строка
со значением 10
, и вы хотите рассматривать ее как число
.Для этого сначала необходимо преобразовать (принудительно) значение из строки
в число
. Явный тип приведения происходит, когда вы хотите преобразовать один тип в другой.
пусть myNumber = 1;
пусть finalStr = myNumber.toString ()
Неявное приведение типов обычно происходит, когда вы применяете операторы к значениям разных типов. В большинстве случаев неявное принуждение запускается по ошибке.
null + {}
Вы когда-нибудь задумывались, почему в JavaScript есть две разные операции сравнения? У нас есть ==
и ===
для сравнения, и большинство разработчиков, которые начинают изучать JavaScript, с трудом пытаются понять различия между ними.
Оператор ==
в некоторых случаях может запускать приведение типа в JavaScript. Представьте, что у вас есть выражение 20 == "20"
и вы хотите вернуть результат. JavaScript преобразует их в один и тот же тип данных, чтобы можно было провести сравнение.
===
не запускает приведение типов в JavaScript, и в большинстве случаев это оператор, который вы хотите использовать для сравнения типов. При использовании этого оператора никакого типа принуждения не будет, и вы сможете лучше работать с типами в JavaScript.
Лучшее решение
TypeScript — это надмножество JavaScript, которое добавляет в язык статическую типизацию. Это помогает лучше структурировать ваш код, выделять неожиданное поведение в вашем коде и уменьшать вероятность неожиданных ошибок.
Некоторые люди могут подумать, что TypeScript — это совершенно другой язык, нежели JavaScript, и что для его изучения потребуется время, и это совершенно неправильно. Когда вы запускаете код TypeScript, происходит то, что вы запускаете JavaScript и все его функции, TypeScript просто гарантирует, что типы, которые вы используете, последовательно назначаются.
Представьте, что вы хотите создать переменную с именем name и хотите убедиться, что эта переменная будет строкой, несмотря ни на что. Вы можете определить тип своей переменной, просто сделав это:
пусть имя: строка = "Роза";
Если вы попытаетесь присвоить переменной name новое значение, отличное от строки, TypeScript покажет вам ошибку.
TypeScript также работает с выводом типа — вам не нужно назначать тип переменной, если вы этого не хотите.Он автоматически будет использовать значение в качестве своего типа.
let name = "Роза";
Когда в вашем приложении есть что-то более сложное, например переменная, которая может иметь разные значения, вы создаете сложные типы. Для этого можно использовать типы объединения, например:
тип Modal = 'open' | 'Закрыть';
Это только одна из основ TypeScript, чтобы показать, как этот расширенный набор JavaScript может помочь вам создать более надежный и структурированный код. Вы заметите разницу и преимущества TypeScript только тогда, когда впервые воспользуетесь им.
Согласно опросу Stack Overflow Survey 2020, TypeScript — более любимый язык, чем JavaScript. В настоящее время TypeScript очень широко используется во многих различных проектах и приложениях. Это определенно помогает разработчикам выявлять ошибки перед запуском кода, позволяя им создавать более строго типизированный и безопасный код JavaScript и улучшая взаимодействие с разработчиками.
Заключение
Все в JavaScript — это либо примитивный тип, либо объект.Знать, как работать с типами в JavaScript, может быть действительно непростой задачей. Иногда это может привести к неожиданным ошибкам и побочным эффектам в наших приложениях.
Мы узнали о различиях между динамически и статически типизированными языками, а также о приведении типов, процессе в JavaScript преобразования одного типа в другой, который работает под капотом. Хорошим решением для устранения неожиданных ошибок типов в JavaScript может быть использование TypeScript, надмножества JavaScript, которое добавляет в язык статическую типизацию.
Продолжайте читать
Прочтите эти публикации, чтобы узнать больше о некоторых ключевых основах JavaScript.
Основы JavaScript: типы и структуры данных | от CodeDraken
Essentials — это серия статей, в которых рассматриваются наиболее часто используемые и важные методы для темы X. Это серия для разработчиков, знающих другой язык или желающих быстро начать работу. В этом посте мы рассмотрим типы и структуры данных.
Я не буду вдаваться в подробности здесь, а просто перечислю общие темы, с которыми вы в конечном итоге столкнетесь в JS, и ресурсы, чтобы узнать о них.Другими словами, я научу вас быстрее, чем вы столкнетесь с этим позже.
— — Предварительные требования
— Типы и основы структур данных
— — Есть ли типы в JS?
— — Статически типизированный
— — Динамически типизированный
— — Слабо типизированный
— — Примитивы
— — Объекты
— — Так когда это сбивает с толку?
— Важные указания
— Некоторые непонятные части
— — Почему объекту присвоено значение NULL?
— — Почему число не является числом?
— — Двойное равенство против тройного равно
— — Примитив не является объектом и не имеет собственных методов
— Советы и уловки
— Ссылки и ссылки
Предварительные требования
Для этой темы ничего не требуется.Это основная фундаментальная часть любого языка, но в JavaScript она быстро сбивает с толку.
Мы будем использовать оператор типа
для изучения типов, представленных ниже.
Есть ли типы в JS?
Кто-то может возразить, что JS нетипизирован или что он не должен вызывать свои типы системного типа. При создании переменной не требуется объявлять тип, как в некоторых других строго типизированных языках, например, int x = 10
. Я (и спецификации JS) утверждают, что JS действительно имеет типы.
JS — это с динамической типизацией и со слабой типизацией .
Статически типизированный
JS не является статически типизированным, если вы не используете язык, инструмент, такой как Typescript или Flow, который компилируется в код JS. Но мы кратко рассмотрим это для сравнения.
Статически типизированный означает, что тип является обязательным и не будет изменяться так легко. Все переменные должны быть объявлены с типом.
int x = 5
string y = 'abc'
Динамически типизированные
Языки с динамической типизацией определяют типы переменных во время выполнения .Это означает, что после запуска вашего кода компилятор / интерпретатор увидит вашу переменную и ее значение, а затем решит, какой она тип. Тип по-прежнему применяется здесь, он просто определяет, какой тип.
var a = 1 // int
b = 'test' // string
// etc
Слабо типизированный
Слабо типизированные языки позволяют выводить типы как другой тип . Например, 1 + '2' // '12'
В JS он видит, что вы пытаетесь добавить число со строкой — недопустимая операция — поэтому он переводит ваше число в строку и приводит к строке ’12 ‘.
Примитивы
Эти шесть типов считаются примитивами . Примитив не является объектом и не имеет собственных методов. Все примитивы неизменяемы .
- Boolean — истина или ложь
- Null — нет значения
- Undefined — объявленная переменная, но не имеет значения
- Number — целые числа, числа с плавающей запятой и т. Д.
- String — массив символов, то есть слов
- Символ — уникальное значение, не равное никакому другому значению.
Все остальное относится к типу Object .Основы
примитивов
Объекты
Вот некоторые из стандартных объектов. Обратите внимание, что некоторые из них тоже были в примитивном списке, но не путайте их. Они действуют как конструкторы и для создания этих типов. т.е. Boolean ('a') // true
Есть два основных объекта, которые вы будете использовать для своих собственных структур:
Есть много других объектов, просто перечислим несколько:
- Function
- Логическое значение
- Символ
- Ошибка
- Число
- Строка
- Регулярное выражение
- Математика
- Установить
Основы объектов
Итак, когда это сбивает с толку?
Это сбивает с толку, когда ваши типы смешиваются, а JavaScript решает, какой тип вашего значения использует приведение типа .Об этом написана целая статья, и я не смог бы ее лучше объяснить:
Далее я рассмотрю некоторые другие запутанные части, а также несколько советов и приемов.
- Все примитивные значения неизменяемы
- Помните о приведении типов
- Статической типизации нет, т.е.
int num = 5
- Механизм JavaScript решает, какой это тип
В JavaScript много запутанных частей — см. Wtf JS?
Почему объект не имеет значения?
В документации он указан как примитивный тип, но его тип
возвращает «объект»
.
По сути, это ошибка, которую не исправляют, потому что она нарушает существующий код. Эта ошибка существует с первой версии JavaScript. Ошибка связана с типом функции
в исходном коде JS — я воспользуюсь псевдокодом, чтобы упростить ее.
псевдотип
Вы поймали ошибку? Они не проверяли null
…
Подробнее об отклоненном предложении по исправлению можно прочитать здесь и увидеть эту часть исходного кода JS здесь.
Почему число не является числом?
typeof NaN // 'число' WTF !?
Короткий ответ: NaN
определяется как числовой тип, но это не действительное число. NaN
— это результат некоторых математических операций, которые нельзя выразить количественно в виде числа.
Или, еще короче, потому, что так сказано в спецификации.
Double Equals vs Triple Equals
На эту тему тоже есть статья о CodeBurst.
В случае сомнений всегда используйте тройное значение .
Примитив не является объектом и не имеет собственных методов
«Вы сказали, что у примитивов нет методов, но затем объясните, как 'abc'.длина
работает! »
Это не было ошибкой и исходит из самой документации.
A примитив (примитивное значение, примитивный тип данных) — это данные, которые не являются объектом и не имеют методов . В коде JavaScript есть 6 примитивных типов данных: строка , число , логическое , null , undefined , символ ( новое в ECMAScript 2015).
Во-первых, не путайте конструкторы с примитивами — каждый примитив имеет конструктор или родительский объект. JS знает, что когда вы пытаетесь получить доступ к методу в примитиве и за кулисами, он будет использовать конструктор для создания объекта из вашего примитива. После запуска метода этот объект собирается сборщиком мусора. (удалено из памяти)
См. несколько примеров ниже.
строка — примитив
Строки на самом деле являются примитивами, как описано в статье, а не целыми объектами.JS знает, когда вы пытаетесь получить доступ к методу объекта String
, а переводит ваш примитив в строковый объект . Когда это будет сделано, временный объект будет удален, и его жизнь будет продолжаться как обычно.
строковый конструктор
Подробнее об этом читайте в книге YDKJS Кайла Симпсона:
Способы использования типов в ваших интересах.
Используйте их с осторожностью. По большей части вы должны использовать Number (str)
parseInt (x)
String (num)
и т. Д.Они здесь, поэтому, если вы увидите это в чужом коде, вы будете знать, что он делает. Или, если вы играете в кодовый гольф ⛳️
трюков — преобразование типов, значение по умолчанию, короткое, если
Спасибо за чтение! Вопросы / отзывы оставляйте в комментариях.
значений • JavaScript для нетерпеливых программистов (версия ES2021)
(Объявление, не блокируйте.)
12 значений
В этой главе мы рассмотрим, какие типы значений имеет JavaScript.
Вспомогательный инструмент: ===
В этой главе мы время от времени будем использовать оператор строгого равенства. a === b
оценивается как true
, если a
и b
равны. Что именно это означает, объясняется в §13.4.2 «Строгое равенство ( ===
и ! ==
)».
12.1 Что такое тип?
В этой главе я рассматриваю типы как наборы значений — например, тип boolean
— это набор { false
, true
}.
12.2 Иерархия типов JavaScript
Рисунок 6: Частичная иерархия типов JavaScript. Отсутствуют классы ошибок, классы, связанные с примитивными типами, и многое другое. Схема намекает на то, что не все объекты являются экземплярами Object
.
На рис. 6 показана иерархия типов JavaScript. Что мы узнаем из этой диаграммы?
- JavaScript различает два типа значений: примитивные значения и объекты. Скоро мы увидим, в чем разница.
- На схеме различаются объекты и экземпляры класса
Объект
. Каждый экземплярОбъект
также является объектом, но не наоборот. Однако практически все объекты, с которыми вы столкнетесь на практике, являются экземплярамиObject
— например, объекты, созданные с помощью объектных литералов. Дополнительные сведения по этой теме описаны в §29.4.3.4 «Объекты, не являющиеся экземплярамиObject
».
12.3 Типы спецификации языка
Спецификация ECMAScript знает всего восемь типов.Имена этих типов (я использую имена TypeScript, а не имена спецификации):
-
undefined
с единственным элементомundefined
-
null
с единственным элементомnull
-
логическое
с элементамиfalse
иtrue
-
номер
тип всех номеров (например,-123
,3.141
) -
bigint
тип всех больших целых чисел (например,г.,-123н
) -
строка
тип всех строк (например,'abc'
) -
символ
тип всех символов (например,Symbol ('My Symbol')
) -
объект
тип всех объектов (отличается отObject
, тип всех экземпляров классаObject
и его подклассов)
12.4 Сравнение примитивных значений с объектами
В спецификации делается важное различие между значениями:
- Примитивные значения являются элементами типов
undefined
,null
,boolean
,number
,bigint
,string
,symbol
. - Все остальные значения — объекта .
В отличие от Java (которая вдохновила здесь JavaScript), примитивные значения не являются гражданами второго сорта. Разница между ними и предметами более тонкая. В двух словах:
- Примитивные значения: это атомарные строительные блоки данных в JavaScript.
- Они передаются по значению : когда примитивные значения присваиваются переменным или передаются функциям, их содержимое копируется.
- Они сравниваются по значению : при сравнении двух примитивных значений сравнивается их содержимое.
- Объекты: составные части данных.
- Они передаются идентификатором (мой термин): когда объекты назначаются переменным или передаются функциям, их идентификаторы (мысленные указатели) копируются.
- Они сравниваются по идентичности (мой термин): при сравнении двух объектов сравниваются их идентичности.
В остальном примитивные значения и объекты очень похожи: они оба имеют свойства (записи ключ-значение) и могут использоваться в одних и тех же местах.TypeError: невозможно назначить только для чтения свойство ‘length’ /
);
12.4.1.2 Примитивы
передаются по значению
Примитивы передаются по значению : переменные (включая параметры) хранят содержимое примитивов. При присвоении примитивного значения переменной или передаче его в качестве аргумента функции его содержимое копируется.
пусть x = 123;
пусть y = x;
assert.equal (y, 123);
12.4.1.3 Примитивы
сравниваются по значению
Примитивы сравниваются по значению : при сравнении двух примитивных значений мы сравниваем их содержимое.
assert.equal (123 === 123, истина);
assert.equal ('abc' === 'abc', истина);
Чтобы увидеть, что такого особенного в этом способе сравнения, прочитайте и узнайте, как сравниваются объекты.
12.4.2 Объекты
Объекты подробно описаны в §28 «Отдельные объекты» и в следующей главе. Здесь мы в основном сосредотачиваемся на том, чем они отличаются от примитивных значений.
Давайте сначала рассмотрим два распространенных способа создания объектов:
Литерал объекта:
const obj = { первый: "Джейн", последняя: 'Доу', };
Литерал объекта начинается и заканчивается фигурными скобками
{}
.Он создает объект с двумя свойствами. Первое свойство имеет ключ«первый»
(строка) и значение«Джейн»
. Второе свойство имеет ключ«последний»
и значение«Doe»
. Для получения дополнительной информации об объектных литералах обратитесь к §28.2.1 «Объектные литералы: свойства».Литерал массива:
const fruit = ['клубника', 'яблоко'];
Литерал массива начинается и заканчивается квадратными скобками
[]
.Он создает массив с двумя элементами :«клубника»
и«яблоко»
. Для получения дополнительной информации о литералах массива обратитесь к §31.2.1 «Создание, чтение, запись массивов».
12.4.2.1 Объекты изменяемы по умолчанию
По умолчанию вы можете свободно изменять, добавлять и удалять свойства объектов:
const obj = {};
obj.count = 2; // добавляем свойство
assert.equal (obj.count, 2);
obj.count = 3; // меняем свойство
утверждать.равно (obj.count, 3);
12.4.2.2 Объекты
переданы идентификатором
Объекты передаются идентификатором (мой термин): переменные (включая параметры) хранят идентификатора объектов.
Идентификатор объекта подобен указателю (или прозрачной ссылке) на фактические данные объекта в куче (подумайте о разделяемой основной памяти движка JavaScript).
При присвоении объекта переменной или передаче его в качестве аргумента функции его идентификатор копируется.Каждый литерал объекта создает новый объект в куче и возвращает его идентификатор.
const a = {}; // свежий пустой объект
// Передаем идентификатор из `a` в` b`:
const b = a;
// Теперь `a` и` b` указывают на один и тот же объект
// (они «разделяют» этот объект):
assert.equal (a === b, истина);
// Изменение `a` также изменяет` b`:
a.name = 'Тесса';
assert.equal (b.name, 'Тесса');
JavaScript использует сборку мусора для автоматического управления памятью:
let obj = {prop: 'value'};
obj = {};
Теперь старое значение {prop: 'value'}
из obj
— это мусор (больше не используется).JavaScript автоматически соберет мусора (удалит его из памяти) в определенный момент времени (возможно, никогда, если достаточно свободной памяти).
Реквизиты: прохождение удостоверения личности
«Передача по идентификатору» означает, что идентификатор объекта (прозрачная ссылка) передается по значению. Этот подход также называется «передача путем совместного использования».
12.4.2.3 Объекты
сравниваются по идентичности
Объекты сравниваются по идентификатору (мой термин): две переменные равны, только если они содержат один и тот же идентификатор объекта.Они не равны, если относятся к разным объектам с одинаковым содержанием.
const obj = {}; // свежий пустой объект
assert.equal (obj === obj, true); // такая же идентичность
assert.equal ({} === {}, ложь); // разные идентификаторы, одинаковый контент
12.5 Операторы
типа
и экземпляра
: какой тип значения?
Два оператора type of
и instance of
позволяют определить, какой тип имеет данное значение x
:
if (typeof x === 'строка') ···
if (x instanceof Array) ···
Чем они отличаются?
-
Тип
различает 7 типов спецификации (минус одно пропуски плюс одно добавление). -
instanceof
проверяет, какой класс создал заданное значение.
Практическое правило: тип
предназначен для примитивных значений; instanceof
для объектов
12.5.1
тип
не определено | 'неопределенный' |
null | 'объект' |
логический | логическое |
Номер | "номер" |
Bigint | 'bigint' |
Строка | 'строка' |
Символ | 'символ' |
Функция | «функция» |
Все остальные объекты | 'объект' |
Табл.2 перечислены все результаты типа
. Они примерно соответствуют 7 типам спецификации языка. Увы, есть два отличия, и это языковые причуды:
-
typeof null
возвращает«объект»
, а не«null»
. Это ошибка. К сожалению, исправить это невозможно. TC39 пытался это сделать, но он сломал слишком много кода в Интернете. -
тип
функции должен быть«объект»
(функции являются объектами).Введение отдельной категории для функций сбивает с толку.
Это несколько примеров использования типа
:
> typeof undefined
'неопределенный'
> typeof 123n
bigint
> typeof 'abc'
'нить'
> typeof {}
'объект'
Упражнения: два упражнения на типа
12.5.2
экземпляр
Этот оператор отвечает на вопрос: было ли значение x
создано классом C
?
Например:
> (function () {}) instanceof Функция
правда
> ({}) instanceof объекта
правда
> [] instanceof Массив
правда
Примитивные значения не являются экземплярами чего-либо:
> 123 instanceof Number
ложный
> '' instanceof String
ложный
> '' instanceof объекта
ложь
Упражнение: экземпляр
упражнений / значений / instanceof_exrc.mjs
12.6 Классы и функции конструктора
Исходные фабрики
JavaScript для объектов — это функции-конструкторы. : обычные функции, которые возвращают «экземпляры» самих себя, если вы вызываете их с помощью оператора new
.
ES6 представил классов , которые в основном являются лучшим синтаксисом для функций-конструкторов.
В этой книге я использую термины конструктор, функция и класс как взаимозаменяемые.
Классы можно рассматривать как разбиение объекта одного типа
спецификации на подтипы — они дают нам больше типов, чем 7 ограниченных в спецификации. Каждый класс — это тип созданных им объектов.
12.6.1 Функции конструктора, связанные с примитивными типами
Каждый примитивный тип (за исключением внутренних типов для undefined
и null
) имеет связанную функцию конструктора (think class):
- Функция конструктора
Boolean
связана с логическими значениями. - Функция конструктора
Число
связано с числами. - Функция конструктора
String
связана со строками. - Функция конструктора
Symbol
связана с символами.
Каждая из этих функций играет несколько ролей — например, Номер
:
Вы можете использовать его как функцию и преобразовывать значения в числа:
assert.equal (Число ('123'), 123);
Номер.прототип
предоставляет свойства для чисел — например, метод.toString ()
:assert.equal ((123) .toString, Number.prototype.toString);
Номер
— это объект пространства имен / контейнера для функций инструментов для чисел — например:assert.equal (Number.isInteger (123), истина);
Наконец, вы также можете использовать
Number
как класс и создавать числовые объекты. Эти объекты отличаются от реальных чисел, и их следует избегать.assert.notEqual (новый номер (123), 123); assert.equal (новый номер (123) .valueOf (), 123);
12.6.1.1 Обертывание примитивных значений
Функции конструктора, относящиеся к примитивным типам, также называются типами-оболочками , поскольку они обеспечивают канонический способ преобразования примитивных значений в объекты. При этом примитивные значения «заворачиваются» в объекты.
const prim = true;
assert.equal (typeof prim, 'логическое');
утверждать.равно (прим. instanceof Boolean, false);
константная оболочка = объект (прим.);
assert.equal (тип завернутый, 'объект');
assert.equal (обернутый instanceof Boolean, true);
assert.equal (wrapped.valueOf (), прим); // развернуть
Обертывание редко имеет значение на практике, но оно используется внутри спецификации языка для придания свойств примитивам.
12.7 Преобразование между типами
Существует два способа преобразования значений в другие типы в JavaScript:
- Явное преобразование: с помощью таких функций, как
String ()
. - Принуждение (автоматическое преобразование): происходит, когда операция получает операнды / параметры, с которыми она не может работать.
12.7.1 Явное преобразование между типами
Функция, связанная с примитивным типом, явно преобразует значения в этот тип:
> логическое (0)
ложный
> Число ('123')
123
> Строка (123)
«123»
Вы также можете использовать Object ()
для преобразования значений в объекты:
> тип объекта (123)
'объект'
В следующей таблице более подробно описано, как работает это преобразование:
не определено | {} |
null | {} |
логическое | новое логическое значение (x) |
номер | новый номер (x) |
bigint | Экземпляр BigInt ( новый выдает TypeError ) |
строка | новая Строка (x) |
символ | Экземпляр Symbol ( новый выдает TypeError ) |
объект | x |
12.7.2 Принуждение (автоматическое преобразование между типами)
Для многих операций JavaScript автоматически преобразует операнды / параметры, если их типы не подходят. Такое автоматическое преобразование называется принуждение .
Например, оператор умножения приводит свои операнды к числам:
Многие встроенные функции тоже принудительно. Например, parseInt ()
преобразует свой параметр в строку (анализ останавливается на первом символе, который не является цифрой):
Упражнение: преобразование значений в примитивы
упражнений / значений / conversion_exrc.mjs
От JavaScript к Rust: типы данных
Возможно, вы следили за моим путешествием по изучению Rust, поскольку я освещал такие темы, как изменяемые переменные, владение, ссылки и ящики. Эти знания делятся на две отдельные категории.
- Материал, имеющий четкую параллель в области JavaScript.
- Материал, совершенно новый, и у меня нет существующей ментальной модели для
. Тем не менее, когда я начал читать и писать больше кода на Rust, я понял, что мне не хватает одного большого кусок головоломки, когда дело доходит до изучения нового языка.У меня не было четкого понимания типов данных в Rust. Я быстро обнаружил, что эта информация попадает в третью «обучающую категорию». Материал, который частично совпадает с моей ментальной моделью JavaScript.
Учитывая эту реальность, я решил, что пост в порядке! Итак, без лишних слов, давайте поговорим о типах данных.
Примитивы
Примитив JavaScript похож на то, что Rust называет скалярным типом. В Rust есть четыре скалярных типа: логические, целые, числа с плавающей запятой и символы.
Кроме того, в Rust Reference упоминаются примитивные типы, в том числе str
и Never
поверх четырех скалярных типов.
Boolean
Начнем с чего-нибудь знакомого, логического. Booleans или bool
в Rust — это тип с двумя возможными значениями: true
или false
. Это соответствует нашему пониманию JavaScript, поэтому здесь никаких изменений.
Номер
Чего нельзя сказать о числах.В Rust вам нужно заботиться о том, какое число вы храните. Это целое число или число с плавающей запятой? Сколько места в битах требуется для хранения? Подписано или без подписи?
В Rust вы можете инициализировать целые числа пяти разных размеров, от 8-битного до 128-битного, со знаком или без знака. Для чисел с плавающей запятой у вас есть либо f32, либо f64; первая — одинарная точность, вторая — двойная точность.
String
Вы могли заметить, что я не упомянул строки как скалярные типы Rust, я упомянул char
.Это верно. Однако в Rust есть примитивный тип str
. Странно то, что вы, вероятно, не будете использовать его иначе, как ссылку на конкретную строку, хранящуюся в памяти, и str
.
Если вы хотите создавать строки или управлять ими, вам нужен расширяемый тип String
. Но будь осторожен! Методы, к которым вы привыкли, например len
(также известная как длина), не вернут то, что вы ожидаете.
Структурные типы
В JavaScript большинство структурных типов являются специфическими реализациями типа объекта JavaScript.Но мы разберем их по отдельности для этой статьи.
Массивы
Теперь мы переходим к той части, где вам нужно перепрограммировать ваш внутренний словарь JavaScript. Массив
— допустимый тип Rust. К сожалению, это не совсем помогает. Массив в Rust имеет фиксированный размер. Если вы ожидаете создать статические данные, которые не изменятся, но вы хотите ссылаться на них / искать их в структуре массива, тогда это может быть то, что вам нужно.
Однако более вероятно, что вам нужен вектор. vec
аналогичен String
. Это тип массива, которым вы можете владеть и динамически увеличивать.
Объекты
Найдите «Тип объекта Rust», и вы обязательно запутаетесь. Вы закончите читать о типах объектов Trait, которые немного более продвинуты, чем то, что вам нужно. На самом деле вы ищете struct
.
В Rust структура определяется как тип, состоящий из других типов. Для меня это похоже на объект JavaScript! О структурах стоит прочитать дальше, потому что они делают некоторые уникальные вещи, когда дело касается изменчивости.
Наборы и карты
Это относительные новички в мире JavaScript, но они являются отличными инструментами в вашем распоряжении. При разработке на Rust вы получите аналогичную функциональность от HashSets и HashMaps.
Обратите внимание, что существуют также реализации этих структур на основе BTree.
Функция
Как и в JavaScript, в Rust есть первоклассные функции. Помимо функций, определенных с помощью ключевого слова fn
, в Rust также есть замыкания. Замыкания — это анонимные функции с синтаксисом, похожим на стрелочные функции JavaScript.
Это все?
JavaScript довольно минимален, когда дело касается типов.