JavaScript 变量与数据类型完全指南:let、const、var 与原始类型

小飞兽 JavaScript 355 次阅读 2026-06-28

Introduction

JavaScript 是弱类型语言,变量本身没有类型约束,但值有类型。理解原始类型(string/number/boolean/null/undefined/symbol/bigint)与引用类型(object/array/function)的区别,以及 let/const/var 的作用域和提升机制,是写出健壮 JS 代码的基础。本文覆盖 ES6+ 变量声明规范与 JavaScript 数据类型体系。

let、const 与 var 的区别

/* var:函数作用域,存在变量提升(hoisting)*/
function varDemo() {
    console.log(x); // undefined(提升)
    var x = 10;
    if (true) {
        var x = 20; // 与外层 x 是同一个变量(函数作用域)
    }
    console.log(x); // 20
}

/* let:块级作用域,存在暂时性死区(TDZ)*/
function letDemo() {
// console.log(y); // ReferenceError
let y = 10;
if (true) {
let y = 20; // 新的块级变量,与外层无关
console.log(y); // 20
}
console.log(y); // 10
}

/* const:块级作用域,必须初始化,不能重新赋值(但引用类型内部可修改)*/
const PI = 3.14159;
const USER = { name: '张三', age: 25 };
USER.age = 26; // 允许:修改对象属性
// USER = {}; // 错误

/* 最佳实践:默认用 const,需要重新赋值时用 let,绝不用 var */

原始数据类型(7种)

/* 1. String */
const str = 'Hello, 世界';
const tmpl = Welcome, ; // 模板字符串

/* 2. Number(双精度浮点,没有整数类型)*/
const n = 42;
const pi = 3.14159;
const nan = 0 / 0; // NaN
const overflow = 1e308; // Infinity

/* 3. Boolean */
const bool = true;
Boolean(''); // false(显式转换)

/* 4. null(空对象引用)*/
const empty = null;
typeof null; // 'object'(历史 bug)

/* 5. undefined(未初始化)*/
let uninitialized;

/* 6. Symbol(唯一标识符)*/
const sym1 = Symbol('id');
const sym2 = Symbol('id');
sym1 === sym2; // false

/* 7. BigInt(大整数)*/
const big = 9007199254740993n;
big + 1n; // 9007199254740994n

typeof 与类型判断

typeof 'hello'     // 'string'
typeof 42          // 'number'
typeof 42n         // 'bigint'
typeof true        // 'boolean'
typeof undefined   // 'undefined'
typeof null        // 'object'(历史 bug)
typeof {}          // 'object'
typeof []          // 'object'
typeof function(){} // 'function'

/* 精确判断数组 */
Array.isArray([]); // true

/* 精确判断 null */
const isNull = val => val === null;

常见问题

    • NaN:是唯一一个不等于自身的值。判断必须用 Number.isNaN()。
  • BigInt 与 Number 不能混用:必须显式转换:BigInt(42) + 1n。
  • 严格模式:在脚本顶部写 'use strict',var hoisting 等危险特性会被禁止。

延伸阅读