菜单

类型、变量和引用

相关源文件

本文档涵盖了 Airbnb JavaScript 风格指南中定义的类型、变量和引用的核心 JavaScript 基础知识。理解这些概念对于编写可维护和可预测的 JavaScript 代码至关重要。有关对象、数组及相关概念的信息,请参阅对象、数组和解构

1. JavaScript 类型

JavaScript 有两大类类型:原始类型和复杂类型(对象)。理解它们存储和访问方式的差异对于编写正确的代码至关重要。

1.1 原始类型

JavaScript 中的原始类型通过值访问,这意味着当你处理它们时,你处理的是它们的实际值,而不是引用。

当你复制一个原始值时,你会得到一个完全独立的副本。

重要提示:Symbols 和 BigInts 无法正确地进行 polyfill,因此在针对不支持它们的旧环境时,请避免使用它们。

来源:README.md65-87

1.2 复杂类型

复杂类型通过引用访问,这意味着当你处理它们时,你处理的是它们值的一个引用,而不是值本身。

当你复制一个复杂值时,两个副本都引用相同的基础数据。

来源:README.md90-105

2. 变量声明

Airbnb 风格指南对变量声明有具体的建议,以提高代码清晰度和避免常见问题。

2.1 使用 const

Airbnb 风格指南强烈建议对所有引用都使用 const,除非变量需要重新赋值。这可以防止意外的重新赋值,并使代码更易于理解。

来源:README.md111-124

2.2 使用 let

当变量必须重新赋值时,请使用 let 而不是 var。这提供了块级作用域,更直观且能避免许多常见错误。

来源:README.md127-143

2.3 理解变量作用域

constlet 都是块级作用域,而 var 是函数作用域。理解这种区别至关重要。

letconst 声明的变量只能在其定义的块内访问。用 var 声明的变量可以在整个函数内访问。

来源:README.md146-160

3. 变量最佳实践

Airbnb 风格指南提供了几个关于处理变量的最佳实践。

3.1 每个变量一个声明

每个变量使用一个 constlet 声明。这使得添加新声明更容易,并避免了仅包含标点符号的 diff。

来源:README.md1653-1674

3.2 声明分组

将所有 const 声明放在一起,然后是所有 let 声明。这提高了可读性,并使依赖关系更清晰。

来源:README.md1677-1700

3.3 按需声明变量

将变量声明放在它们需要的地方,利用块级作用域。

来源:README.md1703-1738

3.4 避免链式赋值

不要链式赋值变量,这会创建隐式全局变量。

来源:README.md1742-1772

3.5 递增和递减

避免使用一元递增和递减运算符(++--)。而是使用更明确的赋值运算符。

来源:README.md1775-1806

4. 提升(Hoisting)注意事项

理解提升对于处理 JavaScript 变量至关重要。

4.1 使用 var 进行提升

var 声明的变量,其声明会被提升到作用域顶部,但赋值仍保留在原地。

来源:README.md1876-1901

4.2 使用 constlet 的暂时死区(Temporal Dead Zone)

constlet 声明的变量也会被提升,但它们被置于“暂时死区”中,直到到达它们的声明。

来源:README.md1903-1908

4.3 函数提升

函数声明会被完全提升,而函数表达式只提升其变量名。

来源:README.md1910-1965

4.4 先定义后使用

遵循“变量、类和函数应在使用前定义”的原则,可以提高代码的可读性并避免与提升相关的错误。

来源:README.md1969-2016

5. 变量声明方法比较表

下表总结了变量声明方法之间的区别。

功能constletvar
可重新赋值
范围模块模块功能
提升 (Hoisting)暂时死区暂时死区声明为 undefined
重新声明
最适合大多数引用需要重新赋值的变量在现代代码中应避免使用

来源:README.md README.md README.md

6. 最佳实践总结

  1. 默认使用 const 进行所有引用;只有当变量需要重新赋值时才使用 let
  2. 永远不要使用 var - 它会创建函数作用域变量,可能导致意外行为。
  3. 每个声明只有一个变量,以提高可读性和可维护性。
  4. const 声明分组,然后是 let 声明。
  5. 按需声明变量,在适当的作用域内。
  6. 永远不要链式赋值变量,以避免创建隐式全局变量。
  7. 避免使用一元递增/递减运算符,而是使用更明确的赋值运算符。
  8. 始终在变量使用前定义它们,以避免与提升相关的错误。

来源:README.md README.md README.md