A variable can hold a literal, the result of an expression, an object, a function, or a value produced at run time (user input, a date, a network response); until assigned, it holds undefined. Assignment copies a primitive value, but shares an object by reference, so two variables can point at the same object.
const price = 30; // literal
const total = price * 1.08; // expression
const item = { name: "Lamp", price }; // object
const describe = (x) => `${x.name}: $${x.price}`; // function
let answer; // declared, no value yet
console.log(total, describe(item), answer);
let a = price; a += 1; // primitives are copied
const b = item; b.price = 45; // objects are shared by reference
console.log(price, a, item.price);32.400000000000006 Lamp: $30 undefined 30 31 45
The long total is binary floating-point rounding (Floating-Point Pitfalls). Changing b changed item, because both names refer to one object; Copying and Comparing shows how to copy objects instead.
