JavaScript 变量与数据类型
一、变量声明
三种声明方式
1. var(传统方式)
var name = "张三"; // 函数作用域或全局作用域
var age = 25;
特点:
- 存在变量提升(hoisting)
- 可重复声明
- 函数作用域
- 可声明前使用(值为undefined)
2. let(ES6+推荐)
let email = "user@example.com"; // 块级作用域
let count = 10;
特点:
- 块级作用域
- 不可重复声明
- 有暂时性死区(TDZ)
- 需要先声明后使用
3. const(ES6+推荐)
const PI = 3.14159; // 块级作用域,必须初始化
const API_URL = "https://api.example.com";
特点:
- 块级作用域
- 必须声明时初始化
- 不可重新赋值(但对象/数组的内容可修改)
- 推荐用于常量
二、数据类型分类
JavaScript 有 8 种基本数据类型:
1. 原始类型(Primitive Types)
| 类型 | 说明 | 示例 | typeof 返回值 |
|---|---|---|---|
| Number | 整数或浮点数 | 42, 3.14, NaN, Infinity |
"number" |
| String | 文本数据 | "Hello", 'World' |
"string" |
| Boolean | 逻辑值 | true, false |
"boolean" |
| Undefined | 未定义的值 | let x; (x为undefined) |
"undefined" |
| Null | 空值 | let x = null; |
"object"(历史遗留) |
| Symbol | 唯一标识符(ES6) | Symbol("id") |
"symbol" |
| BigInt | 大整数(ES2020) | 123n, BigInt(9007199254740991) |
"bigint" |
2. 引用类型(Reference Type)
| 类型 | 说明 | 示例 | typeof 返回值 |
|---|---|---|---|
| Object | 对象/字典 | {name: "John", age: 30} |
"object" |
| Array | 数组 | [1, 2, 3] |
"object" |
| Function | 函数 | function() {} |
"function" |
| Date | 日期 | new Date() |
"object" |
| RegExp | 正则表达式 | /pattern/ |
"object" |
三、数据类型检测
1. typeof 运算符
typeof 42; // "number"
typeof "Hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof null; // "object" (历史遗留问题)
typeof {}; // "object"
typeof []; // "object"
typeof function(){}; // "function"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint"
2. instanceof 运算符(检测引用类型)
[] instanceof Array; // true
{} instanceof Object; // true
new Date() instanceof Date; // true
3. Array.isArray()(专用于数组检测)
Array.isArray([]); // true
Array.isArray({}); // false
4. 严格类型检查
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
四、类型转换
1. 显式类型转换
// 转换为字符串
String(123); // "123"
(123).toString(); // "123"
// 转换为数字
Number("123"); // 123
parseInt("123px"); // 123
parseFloat("3.14"); // 3.14
// 转换为布尔值
Boolean(0); // false
Boolean(""); // false
Boolean("hello"); // true
!!0; // false (双非运算符)
2. 隐式类型转换
"5" + 3; // "53" (字符串连接)
"5" - 3; // 2 (数字运算)
"5" * "2"; // 10
!"hello"; // false
!!"hello"; // true
+"123"; // 123 (一元加号转为数字)
3. 常用转换规则
// 假值(falsy values)
false, 0, "", null, undefined, NaN
// 真值(truthy values)
true, 1, "hello", [], {}, function(){}
五、变量作用域
1. 全局作用域
var globalVar = "全局变量"; // 全局作用域(浏览器中为window对象)
let globalLet = "全局let"; // 全局作用域,但不是window属性
2. 函数作用域(var)
function test() {
var localVar = "局部变量"; // 只在函数内可访问
console.log(localVar);
}
3. 块级作用域(let/const)
if (true) {
let blockScoped = "块级作用域";
const CONST_IN_BLOCK = "块内常量";
// 这里可以访问
}
// 这里不能访问
六、最佳实践
- 优先使用 const,需要重新赋值时使用 let
- 避免使用 var(除非有特殊原因)
- 变量命名使用驼峰式(camelCase)
- 常量命名使用大写加下划线(UPPER_SNAKE_CASE)
- 初始化时声明,不要先声明后赋值(除非必要)
- 使用严格相等(=== 和 !==)避免类型转换问题
// 推荐做法
const MAX_SIZE = 100;
let currentCount = 0;
const user = {
name: "张三",
age: 25
};
// 不推荐
var oldVariable = "过时写法";
let data; // 避免未初始化的声明
data = "稍后赋值";
七、特殊值处理
1. null vs undefined
let a; // undefined - 声明但未赋值
let b = null; // null - 明确赋值为空
// 检查
if (value === null) {} // 检查是否为null
if (value === undefined) {} // 检查是否为undefined
if (value == null) {} // 检查null或undefined(宽松相等)
2. NaN(Not a Number)
0 / 0; // NaN
Number("hello"); // NaN
NaN === NaN; // false(NaN与自身不相等)
isNaN(NaN); // true
Number.isNaN(NaN); // true(ES6更准确的方法)
3. Infinity
1 / 0; // Infinity
-1 / 0; // -Infinity
isFinite(123); // true
isFinite(Infinity); // false
注意:JavaScript 是动态类型语言,变量类型可以在运行时改变,但应避免这种模式以提高代码可读性和可维护性。







