JavaScript基础语法全解析:从变量到数据结构的实践指南

一、变量声明与作用域管理

1.1 变量声明方式对比

JavaScript提供三种变量声明方式:varletconst,三者存在本质差异:

  • var:函数作用域声明,存在变量提升现象
    1. console.log(x); // undefined(变量提升)
    2. var x = 10;
  • let:块级作用域声明,支持TDZ(暂时性死区)
    1. console.log(y); // ReferenceError: Cannot access 'y' before initialization
    2. let y = 20;
  • const:常量声明,必须初始化且不可重新赋值
    1. const PI = 3.14;
    2. PI = 3.1415; // TypeError: Assignment to constant variable

1.2 作用域链解析

变量查找遵循从内向外的作用域链机制:

  1. let globalVar = 'global';
  2. function outer() {
  3. let outerVar = 'outer';
  4. function inner() {
  5. console.log(globalVar); // 访问全局变量
  6. console.log(outerVar); // 访问外层函数变量
  7. }
  8. inner();
  9. }
  10. outer();

二、数据类型与类型检测

2.1 原始类型与引用类型

JavaScript包含7种原始类型和1种引用类型:

  • 原始类型:numberstringbooleannullundefinedsymbolbigint
  • 引用类型:object(包含数组、函数、日期等)

2.2 类型检测方法

  1. // typeof操作符(无法区分null和对象)
  2. console.log(typeof 42); // "number"
  3. console.log(typeof 'hello'); // "string"
  4. console.log(typeof null); // "object"(历史遗留问题)
  5. // instanceof检测对象类型
  6. console.log([] instanceof Array); // true
  7. // Object.prototype.toString方法
  8. function getType(value) {
  9. return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
  10. }
  11. console.log(getType(new Date())); // "date"

2.3 特殊值处理

  • undefined:变量未初始化时的默认值
  • null:显式赋值为空值
  • NaN:非数字值的特殊表示
    1. console.log(Number('abc')); // NaN
    2. console.log(isNaN('123')); // false(会先尝试类型转换)
    3. console.log(Number.isNaN('abc')); // true(严格检测)

三、运算符与表达式

3.1 数值运算特性

JavaScript采用IEEE 754双精度浮点数标准,存在精度限制:

  1. console.log(0.1 + 0.2); // 0.30000000000000004
  2. console.log(3.1234567890123456789); // 3.1234567890123457(有效数字16位)

3.2 严格相等比较

使用===进行严格比较,避免类型转换带来的意外:

  1. console.log(0 == false); // true(类型转换)
  2. console.log(0 === false); // false(严格比较)
  3. console.log(null == undefined); // true(特殊规则)
  4. console.log(null === undefined); // false

四、流程控制结构

4.1 条件判断进阶

  1. // 多条件判断优化
  2. function getStatus(code) {
  3. return {
  4. 200: 'OK',
  5. 404: 'Not Found',
  6. 500: 'Server Error'
  7. }[code] || 'Unknown Status';
  8. }
  9. // switch语句注意事项
  10. let day = 3;
  11. let dayName;
  12. switch (day) {
  13. case 1:
  14. case 2:
  15. case 3:
  16. case 4:
  17. case 5:
  18. dayName = 'Weekday';
  19. break; // 必须包含break
  20. default:
  21. dayName = 'Weekend';
  22. }

4.2 循环控制技巧

  1. // for...of遍历数组
  2. const colors = ['red', 'green', 'blue'];
  3. for (const color of colors) {
  4. console.log(color);
  5. }
  6. // while循环注意事项
  7. let i = 0;
  8. while (i < 5) {
  9. if (i === 3) break; // 提前终止
  10. console.log(i);
  11. i++;
  12. }

五、数组操作全解

5.1 数组创建方式

  1. // 字面量方式
  2. const arr1 = [1, 2, 3];
  3. // Array构造函数
  4. const arr2 = new Array(5); // 创建长度为5的空数组
  5. const arr3 = new Array(1, 2, 3); // 等同于字面量
  6. // Array.of方法(ES6新增)
  7. const arr4 = Array.of(5); // [5](与构造函数区别)

5.2 常用数组方法

  1. // 不可变方法(返回新数组)
  2. const numbers = [1, 2, 3, 4];
  3. const doubled = numbers.map(n => n * 2); // [2, 4, 6, 8]
  4. // 可变方法(修改原数组)
  5. const letters = ['a', 'b', 'c'];
  6. letters.push('d'); // ['a', 'b', 'c', 'd']
  7. letters.splice(1, 1); // ['a', 'c', 'd']
  8. // 迭代方法
  9. numbers.forEach(n => console.log(n));
  10. const found = numbers.find(n => n > 2); // 3

5.3 类数组对象转换

  1. // arguments对象转换
  2. function sum() {
  3. const args = Array.from(arguments);
  4. return args.reduce((a, b) => a + b);
  5. }
  6. // DOM元素集合转换
  7. const divs = document.querySelectorAll('div');
  8. const divArray = Array.from(divs);

六、最佳实践建议

  1. 严格模式:在文件顶部添加'use strict';启用严格模式
  2. 变量命名:采用驼峰命名法,避免使用保留字
  3. 常量定义:全部使用const声明,仅在需要重新赋值时使用let
  4. 错误处理:使用try...catch处理可能抛出异常的操作
  5. 性能优化:避免在循环中创建函数,注意闭包引用

通过系统掌握这些核心语法特性,开发者能够编写出更健壮、更易维护的JavaScript代码。建议结合实际项目进行实践验证,逐步深化对语言特性的理解。