JavaScript 基础回顾:你需要掌握的核心概念

JavaScript 是前端开发的基石,但其背后的一些核心概念,如数据类型、变量作用域和模块化,对于初学者来说可能有点难以理解。本文将带你系统地回顾这些关键基础,助你构建坚实的代码基石。


数据类型和常用方法

JavaScript 提供了多种内置的数据类型。其中,原始类型(如 string, number, boolean)和非原始类型object,如数组和函数)是所有数据操作的基础。

  • 字符串和 toString() 方法
    虽然大多数时候我们直接使用字符串字面量,但你可以使用 String 构造函数来创建字符串对象。更常见的是使用 toString() 方法将其他数据类型转换为字符串。这个方法非常灵活,例如,它可以将数字转换为不同进制的字符串表示。

    const num = 10;
    console.log(num.toString(2)); // "1010"(二进制)
    
  • Number 构造函数
    与字符串类似,Number 构造函数可以创建数字对象。但它最常见的用途是将其他值(如字符串)强制转换为数字

变量和函数的命名规范

良好的命名习惯能让你的代码更易于阅读和维护。JavaScript 开发者遵循一些约定俗成的规范:

  • 驼峰命名法(camelCasing):这是变量和函数命名的首选约定,第一个单词小写,后续每个单词的首字母大写(如 isLoading)。
  • 布尔值:通常使用 is, has, can 等前缀来表示布尔变量的状态(如 isLoggedIn)。
  • 函数命名:函数名应清晰地表明其功能。获取数据的函数通常以 get 开头,设置数据的以 set 开头,处理事件的以 handle 开头。
  • 循环迭代器:在 for 循环中,通常使用单个字母(i, j, k)作为迭代器变量。

稀疏数组与内存管理

JavaScript 的数组有一个有趣的概念叫稀疏数组。它指的是数组中存在“空槽”,这些空槽与值为 undefined 的元素不同。

在内存管理方面,JavaScript 引擎为你处理了大部分工作。它的自动垃圾回收机制会识别并回收不再使用的内存,开发者无需手动释放。

闭包和作用域

闭包(Closure) 是 JavaScript 中一个非常强大的特性,它允许一个内部函数访问其外部函数的变量,即使外部函数已经执行完毕并返回。这是因为内部函数“记住”了其外部环境。

function outerFunction(x) {
  let y = 10;
  function innerFunction() {
    console.log(x + y);
  }
  return innerFunction;
}

let closure = outerFunction(5);
closure(); // 15

var 关键字和变量提升

在现代 JavaScript 中,我们主要使用 letconst 来声明变量。但在 2015 年之前,var 是唯一的选择。了解 var 的一些“怪癖”仍然很重要:

  • 可重复声明var 允许你在同一作用域内重复声明同一个变量,而 letconst 会抛出错误。
  • 函数作用域var 没有块级作用域。在 if 语句或 for 循环中用 var 声明的变量,在外部仍然可以访问。
  • 变量提升(Hoisting):这是 JavaScript 的默认行为,它会将声明移动到其作用域的顶部。var 变量会被提升并初始化为 undefined,但 letconst 也会被提升,但它们在声明前无法访问,处于“暂时性死区”中。

模块化:导入与导出

为了组织和复用代码,现代 JavaScript 引入了模块的概念。一个模块是一个独立的文件,用于封装相关的代码。

  • 导出(Export):使用 export 关键字来公开你想在其他文件中使用的变量、函数或类。
    • 命名导出export function add() {}
    • 默认导出export default function subtract() {}
  • 导入(Import):使用 import 关键字将其他模块中导出的内容引入到你的文件中。
    • 命名导入import { add } from './math.js';
    • 默认导入import subtract from './math.js';
    • 命名空间导入import * as Math from './math.js';(导入所有内容)

通过掌握这些基础概念,你将能够更好地理解和编写健壮、可维护的 JavaScript 代码。

更多推荐