以下是 JavaScript 中 变量 和 数据类型 的全面详解,包含示例说明:
一、变量(Variables)
JavaScript 中变量用于存储数据,通过 var、let、const 声明。
1. var (ES5)
- 作用域:函数作用域(在函数内声明)或全局作用域。
- 提升(Hoisting):变量声明会被提升到作用域顶部。
- 可重复声明:允许重复声明同一变量。
- 示例:
var a = 10; if (true) { var a = 20; // 覆盖外部的 a } console.log(a); // 20
2. let (ES6)
- 作用域:块级作用域(
{}内有效)。 - 不可重复声明:同一作用域内不可重复声明。
- 暂时性死区:声明前访问会报错。
- 示例:
let b = 10; if (true) { let b = 20; // 与外部的 b 无关 console.log(b); // 20 } console.log(b); // 10
3. const (ES6)
- 作用域:块级作用域。
- 不可重新赋值:声明时必须初始化,且不能重新赋值。
- 对象/数组可修改:对象属性或数组元素可修改。
- 示例:
const c = 30; c = 40; // 报错:Assignment to constant variable const obj = { name: "Alice" }; obj.name = "Bob"; // 允许修改属性
二、数据类型(Data Types)
JavaScript 是动态类型语言,数据类型分为 原始类型(Primitive) 和 对象类型(Object)。
1. 原始类型(Primitive Types)
string:字符串。let str = "Hello"; let templateStr = `Hello, ${str}!`; // 模板字符串(ES6)number:数字(整数、浮点数、Infinity、NaN)。let num = 42; let float = 3.14; let nan = NaN; // 非数字 let inf = Infinity;boolean:布尔值(true/false)。let isTrue = true; let isFalse = false;null:表示空值(需显式赋值)。let empty = null; // 通常用于主动清空对象undefined:未定义的值(默认初始值)。let uninitialized; console.log(uninitialized); // undefinedsymbol(ES6):唯一且不可变的值,用于对象属性键。const sym1 = Symbol("key"); const sym2 = Symbol("key"); console.log(sym1 === sym2); // false(唯一性)bigint(ES2020):大整数(以n结尾)。const bigNum = 123456789012345678901234567890n;
2. 对象类型(Object Types)
Object:通用对象。const person = { name: "Alice", age: 30, greet() { console.log("Hello!"); } };Array:数组。const arr = [1, "two", true]; arr.push({ name: "Bob" });Function:函数。function add(a, b) { return a + b; } const multiply = (a, b) => a * b; // 箭头函数Date:日期。const now = new Date(); console.log(now.toISOString());- 其他内置对象:
RegExp:正则表达式。Error:错误对象(如new Error("Oops!"))。Map/Set(ES6):键值对集合/唯一值集合。
三、类型检测与转换
1. 类型检测
typeof:检测原始类型(注意typeof null返回"object")。typeof "hello"; // "string" typeof null; // "object"(历史遗留问题) typeof [1,2,3]; // "object"instanceof:检测对象类型。[] instanceof Array; // true {} instanceof Object; // trueArray.isArray():检测数组。Array.isArray([1,2,3]); // true
2. 类型转换
- 显式转换:
Number("123"); // 123 String(123); // "123" Boolean(0); // false - 隐式转换:
"5" + 1; // "51"(字符串拼接) "5" - 1; // 4(数字运算)
四、注意事项
nullvsundefined:null是开发者主动赋值的空值。undefined表示变量未初始化。
- 引用类型比较:
{} === {}; // false(不同对象) [1,2] === [1,2]; // false(不同数组) - 原始类型包装对象:
const str = "hello"; str.toUpperCase(); // 自动转换为 String 对象
五、总结
- 变量声明:优先使用
const和let,避免var。 - 数据类型:
- 原始类型:直接存储值,不可变。
- 对象类型:存储引用,属性可变。
- 类型检测:结合
typeof、instanceof和专用方法(如Array.isArray())。