Для проверки переменных и значений на их тип данных, в js есть метод typeof
(тут переменная или значение)
'use strict';
let num = 10;
console.log(typeof(num)) // number
console.log(typeof('строка')); // string
Далее я буду пользоваться этим методом для наглядной демонстрации типа данных.
В javascript
существует восемь типов данных. Из них семь типов состоят из примитивных значений и один комплексный тип объект.
Это обычные цифры, числа. Максимальное допустимое число для безопасной работы в javaScript 253 степени.
Так же кроме обычных чисел есть специальные значения: Infinity
, -Infinity
и NaN
- они все относится к типу number
.
'use strict';
let numbers = 12;
console.log(typeof(numbers)); //number
'use strict';
console.log(4 / 0); // Infinity
console.log(-4 / 0); // -Infinity
console.log(typeof(4 / 0)); // number
NaN
будем получать при ошибочных метематических операциях. Например умножаем то, что умножать нельзя.
'use strict';
console.log(4 * 's')// NaN
console.log(typeof(4 * 's'))// number
// Умножаем число на строку, получаем NaN
Строки всегда в одинарных или двойных кавычках ''
""
.
'use strict';
let str = 'привет'
let str2 = '12' // это строка
console.log(typeof(str)); // string
Булевый тип имеет два значения: true
(истина) и false
(ложь). Используется для работы с условиями.
'use strict';
let booleanTypes1 = true;
let booleanTypes2 = false;
console.log(typeof(booleanTypes1,booleanTypes2)); // boolean
null
- это тип данных, который содержит в себе только null
. Он подразумевает отсутствие объектного значения.
Если проверять тип null
то выдаст 'object'
- это особенность языка javascript.
'use strict';
let a = null;
console.log(a); // null
Тип undefiend
имеет только одно значение - undefiend
. Присваивается переменным, которые были только объявлены, без значения. Так же аргументам в функциях, для которых не были установлены значения.
'use strict';
let a;
console.log(a); // undefined
function f1 (a,b) {
console.log(a);
}
f1(); //undefined
Тип symbol
(символ) используется для создания уникальных идентификаторов в объектах. Если вы только изучаете javaScript, то можете пропустить этот тип данных.
const obj = {};
const sym = Symbol();
obj[sym] = 'hi';
obj.hello = 'hello';
console.log(obj); // { hello: 'hello', [Symbol()]: 'hi' }
console.log(sym in obj); // true
console.log(obj[sym]); // hi
console.log(Object.keys(obj)); // ['hello']
console.log(typeof(sym)); // symbol
Квадратные скобки используются для доступа к свойствам объекта, когда имя свойства неизвестно на момент написания кода или когда имя свойства содержит пробелы или другие символы, которые не допустимы в идентификаторах Javascript
. Поэтому используем их, но пока это не очень важная информация, но написать стоило.
Свойства созданные с помощью Symbol
скрыты. Они не будут перечислены при использовании методов Object.keys()
, Object.values()
и Object.entries()
.
BigInt
позволяет работать с числами больше чем 253степени.
BigInt
создаётся путём добавления n
в конец целочисленного литерала или вызова функции BigInt()
.
'use strict';
let a = 9007199254740991n;
let b = BigInt(9007199254740991);
let c = 1.23845722n; // error
console.log(typeof(a)); // bigint
Объект - это структура данных которая может иметь в себе разные данные. При этом эти данные могут быть разного типа, это благодаря динамической типизации языка.
'use strict';
// этот объект содержит в себе определенные свойства(своеобразные переменные).
// Любое свойство подразумевает пару "ключ(имя):значение(что угодно)", обязательно ставим двоеточие.
const obj = { // Создав переменную просто открываем фигурные скобки {}. Так, мы создали объект.
name: 'Dima', // свойство с ключом name со значением Dima
age: 24, // свойство с ключом age со значением 24 и тд.
watchAnime: true
// Идут свойства через запятую, у последнего свойства ставить запятую не нужно.
}
// проверим на тип данных
console.log(typeof(obj));// object
// Что бы обратиться к свойству в объекте, пишем имя объекта и через точку свойство. Проверим тип данных свойства name
console.log(typeof(obj.name)); // string ('Dima' - это строка)
Комплексный он потому что на основе объекта могут быть разные конструкции(Специальные объекты)
Массив это частный случай объекта. Он как бы в своей основе объект, но немного с другим поведением. Все данные хранятся строго по порядку!
'use strict';
// создав переменную прописываем квадртаные скобки []. Все, массив готов.
const arr = ['ss', 1, {}, []]; // Массив как и объект так же может содержать в себе разные типы.
// Но здесь есть только значения, а Его ключи они фиксированны и идут строго по порядку от 0 - это индекс(позиция элемента)
// Например строка 'ss' - она первая и ее индекс(позиция) будет 0, далее число 1 с индексом 1 и так далее.
// В программировании все начинается с 0 (Первый элемент это всегда позиция 0).
// проверим позицию элемента (просто указываем массив и нужный индекс в квадратных скобках []).
console.log(arr[0]); // нам выдаст 'ss'
// проверим тип данных массива
console.log(typeof(arr)); // object
// проверим тип данных элемента под индексом 0
console.log(typeof(arr[0])); // string (потому что там строка 'ss')
Пример который показывает, что массив в javascript
- это объект.
const arr = [];
arr[0] = 1;
arr['abc'] = 2;
console.log(arr['abc']); // 2
Мы как и в обычном объекте добавили ключ:значение
. Но делать так не нужно.
О работе функциях я буду говорить не здесь. Пока просто проверим тип данных функции.
Мы получим function
. Это техническая часть, углубляться пока что нет смысла. Но функция это специальный объект, просто так же имеет свой специальный тип вот и все.
'use strict';
const f1 function () {
return;
};
console.log(typeof(f1)) // function
С объектом даты так же будем работать позже.
'use strict';
let now = new Date();
console.log(typeof(now)); // object
И с этими понятиями познакомимся позже
'use strict';
let reg = /i/g // регулярное выражение
console.log(typeof(reg)); // object
let err = new Error(); // объект ошибки
console.log(typeof(err)); // object
Типизация - подразумевает классификацию типов данных.
Динамическая типизация - это когда тип данных задается(классифицируется) при присваивании значения:
let num = 1; // JavaScript понимает, что здесь тип данных числовой, при добавлении в переменную значения.
// Это и есть Динамическая типизация, то есть она меняется в динамике.
Так же стоит упомянуть, что есть статическая типизация.
Так же динамическая типизация подразумевает неявное приведение типов. Неявнное приведение типов - это автоматическое приведение типа, выполняемое компилятором. То есть когда мы это делаем неявно, не каким то специальным методом.
Привести к строке можно с помощью конкатенации(Это склеивание строк вместе).
Конкатенация - сложение строк или строки с чем то(для этого используется математический +
).
console.log(typeof(5 + '')); // string
// Мы сложили число с пустой строкой. В итоге получили '5' - строку
console.log(typeof(undefined + '')); //string
// Получили 'undefined' - строка
// так же можно и не с пустой строкой. Допустим добавляем через js какие то стили и нам нужно 25px
console.log(25 + 'px')); // 25px - это строка
Пустые массивы в операциях с конкатенацией равняются путой строке
console.log(typeof([]+[])); // string
console.log([] + 5); // даст строку '5'
console.log(typeof({}+{})); // string
// объект тоже превращает в строку. Но при конкатенации объект не равен пустой строке, он будет выдавать [object Object] (просто строчное представления объекта)
console.log({} + 5); // [object Object]5
// Это все приведет к строке и типу данных string. Но не получится как с помощью массива превратить 5 в "5".
К числу приводит унарный +
это довольно частый способ.
console.log(typeof(+ '5')); // number
let answ = +prompt('num?',''); // мы введем число(Все что мы получаем от пользователя это всегда будут строки)
// Так вот, мы ввели число допустим 100. В prompt передалась строка '100', далее унарный + привел '100' к числу 100
К числу приводят операторы сравнения >
, <
, <=
, >=
.
console.log(3 > '1') // вернет true.
// js сам взял строку '1' и привел ее к числовому типу, а потом выполнил сравнение
Так же и арифметические операторы -
, *
, /
, %
. Кроме +
с двумя операндами(конкатенация).
console.log('3' - 2) // 1
// js привел строку '3' в числовой тип и отнял 2. Получаем цифру 1
// но с + произошла конкатенация
console.log(3 + '3'); // 33
Важно запомнить значения и типы которые приводят к логическому типу.
Добавим в массив все, что превращается в false
.
const itIsFalse [0,'',null,undefiend,NaN]; // все это приведет в условии к false
// если мы получаем false, то условие не будет выполнено, если true - будет.
if(0 == '') {
console.log('0')
} // это условие сработает, так как 0 - false и '' тоже false. false равно false? да, получим true. Об условиях тоже позже.
let switcher = null;
if (switcher) { // не сработает, так как в переменной null.
console.log('working...');
}
// так же довольно часто используется подобный синтаксис:
if(argument) { // мы передаем некий аргумент(если внутри функции например)или переменную. Если она пуста, код не выполнится, так как там будет undefiend.
console.log('я что-то cделаю если в переменной, что-то будет')
}
Все остальное будет true
. Любая цифра или число кроме 0
, любая строка кроме пустой ''
.
Так же любой объект в логическом контексте – true
, даже если это пустой массив []
или объект {}
if ({} && []) {
console.log("Все объекты - true!"); // код сработает.
}
Логические операторы!
,!!
, &&
, ||
console.log(typeof(!!'42432')); // boolean
console.log(2 || '') // 2
// оператор или || и оператор && вернут числа. Но для этого они неявно преобразует их в логический тип.
console.log('he' && 12) // 12
Когда мы будем говорить про операторы, то все станет более менее ясно.