JavaScript 变量与数据类型完全指南:let、const、var 与原始类型
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 等危险特性会被禁止。
延伸阅读
- MDN JavaScript 数据类型:MDN Data Structures