Типы данных
В JavaScript восемь типов. Семь примитивных и один объектный.
Примитивы
number
Все числа — number:
let a = 42;
let b = 3.14;
let c = -1;
let d = Infinity;
let e = NaN; // Not a Number
let f = 0xff; // 255
let g = 1_000_000;
bigint
Для чисел больше Number.MAX_SAFE_INTEGER:
const big = 9007199254740993n;
const bigger = BigInt('9007199254740993');
string
let a = 'одинарные';
let b = "двойные";
let c = `шаблонные ${a}`;
Многострочные:
const text = `Первая строка
Вторая строка`;
boolean
let t = true;
let f = false;
null
Явное «ничего»:
let user = null;
undefined
Значение по умолчанию для необъявленных:
let x;
console.log(x); // undefined
symbol
Уникальные ключи:
const id = Symbol('id');
const obj = { [id]: 1 };
Объект
Всё, что не примитив — объект:
const user = { name: 'Алиса' };
const items = [1, 2, 3];
const fn = () => {};
const date = new Date();
Массивы, функции, даты, регулярки — всё объекты.
typeof
Проверка типа:
typeof 'строка'; // 'string'
typeof 42; // 'number'
typeof true; // 'boolean'
typeof undefined; // 'undefined'
typeof null; // 'object' — историческая ошибка
typeof Symbol(); // 'symbol'
typeof 10n; // 'bigint'
typeof {}; // 'object'
typeof []; // 'object'
typeof function() {}; // 'function'
typeof null === 'object' — баг, оставленный для совместимости.
Для массива:
Array.isArray([]); // true
Приведение типов
Явное
Number('42'); // 42
String(42); // '42'
Boolean(0); // false
parseInt('42px'); // 42
parseFloat('3.14'); // 3.14
Неявное
'5' + 3; // '53' — конкатенация
'5' - 3; // 2 — вычитание
'5' * '2'; // 10
1 + true; // 2
1 + null; // 1
1 + undefined; // NaN
Truthy и falsy
При приведении к boolean:
Falsy:
false0,-0,0n''(пустая строка)nullundefinedNaN
Truthy: всё остальное, включая '0', [], {}, 'false'.
if ([]) console.log('truthy'); // выполнится
if ('') console.log('falsy'); // не выполнится
Проверка NaN
Number.isNaN(NaN); // true
Number.isNaN('строка'); // false
isNaN('строка'); // true — приводит к числу
Используй Number.isNaN.
Сравнение
0 == ''; // true — нестрогое
0 === ''; // false — строгое
null == undefined; // true
null === undefined; // false
NaN === NaN; // false
Правило: используй === и !== всегда, кроме проверки x == null (проверяет и null, и undefined).
Object.is
Object.is(NaN, NaN); // true
Object.is(0, -0); // false
Отличие от === только в этих двух случаях.
Итоги
- Семь примитивов + объект
typeofдля проверки типаArray.isArrayдля массивов- Неявное приведение — источник багов
- Falsy:
false,0,'',null,undefined,NaN ===вместо==