JavaScript 基础:类型与对象深度解析
一、变量声明机制
1. var 的特性
- 函数作用域:仅在声明函数内部有效
- 变量提升:声明会被提升到作用域顶部,但赋值不会
- 重复声明:允许相同作用域内多次声明
- 全局污染风险:全局声明会成为 window 对象属性
console.log(x); // undefined(变量提升)
var x = 10;
function test() {
var y = 20;
}
console.log(y); // 报错(函数作用域限制)
2. let/const 的现代特性
- 块级作用域:仅在
{}范围内有效 - 暂时性死区:在声明前访问会报错
- 无变量提升:声明前访问会直接报错
- const 不可变性:不能重新赋值整个变量(但可修改对象属性)
if (true) {
let y = 20;
const PI = 3.14;
PI = 3.15; // TypeError
}
console.log(y); // 报错(块级作用域限制)
3. 变量声明最佳实践
- 使用
let作为默认变量声明方式 - 使用
const声明不可变的常量 - 避免使用
var(除非需要兼容IE11)
二、数据类型系统
1. 基本类型(Primitive Types)
- String:不可变值类型
- Number:包含整数、浮点数、NaN、Infinity
- Boolean:true/false
- Undefined:未赋值状态
- Null:空对象指针
let str = 'Hello'; // String
let num = 42; // Number
let isTrue = true; // Boolean
let nothing = null; // Null
let undef; // Undefined
2. 引用类型(Reference Types)
- Object:基础数据容器
- Array:有序数据集合
- Function:可执行代码块
let obj = { name: 'Alice' }; // Object
let arr = [1, 2, 3]; // Array
let func = () => console.log('Arrow'); // Function
3. 类型转换陷阱
console.log(1 + '2'); // "12"(隐式转换)
console.log(1 * '2'); // 2(数值转换)
console.log(Boolean(0)); // false
三、对象系统详解
1. 动态属性特性
const person = { name: 'Bob' };
person.age = 25; // 动态添加属性
delete person.age; // 动态删除属性
2. 原型链机制
// 原始值通过包装对象调用方法
"hello".toUpperCase(); // 等价于 new String("hello").toUpperCase()
3. 接口模拟实现
// 接口定义(通过约定实现)
const Animal = {
speak: function() {
console.log("Some sound");
}
};
// 接口实现
const Dog = {
speak: function() {
console.log("Woof!");
}
};
Dog.speak(); // 接口调用
四、常见误区与解决方案
1. const 可变性误解
// 错误示例(会报错):
const PI = 3.14;
PI = 3.15; // TypeError
// 正确使用:
const obj = { value: 42 };
obj.value = 100; // 允许修改属性
2. 块级作用域陷阱
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// 输出:3,3,3(var作用域问题)
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 100);
}
// 输出:0,1,2(let块级作用域)
结语:掌握这些基础概念是成为合格JavaScript开发者的第一步。建议通过实际项目练习巩固理解,推荐配合MDN官方文档学习最新规范。