Skip to content
On This Page

JavaScript基础知识

1. ES6 新增特性

ECMAScript 6(简称ES6)为JavaScript语言带来了许多新的特性和改进,使得JavaScript编程更加方便、高效和优雅。以下是ES6中的一些主要新特性:

  1. 块级作用域
    • ES6引入了letconst关键字,用于在块级作用域中声明变量。与var不同,letconst声明的变量只在当前代码块内有效,避免了变量提升和全局命名冲突的问题。
  2. 箭头函数
    • 箭头函数是ES6中一种新的函数声明方式,使用箭头(=>)取代传统的function关键字。箭头函数具有更简洁的语法,并且自动绑定了上下文(即this的值),解决了回调函数中this指向问题。
  3. 解构赋值
    • 解构赋值允许从数组或对象中提取值,并赋值给变量。在ES6中,可以使用解构赋值语法快速获取数组或对象中的元素,从而简化了代码编写和数据交换。
  4. 默认参数
    • ES6允许在函数定义时为参数提供默认值。如果调用函数时未传递某个参数,将使用默认值。这可以简化函数的使用,并且可以传递部分参数而不是全部参数。
  5. 扩展运算符
    • 扩展运算符(...)可以将数组或对象展开,提取出其中的元素。在函数调用或数组和对象字面量中,使用扩展运算符可以将数组或对象展开成独立的元素,或将多个元素合并成数组或对象。
  6. 模板字符串
    • 模板字符串是一种更方便的字符串拼接方式,使用反引号(``)定义字符串,并可以在其中插入变量和表达式,提高了代码的可读性和可维护性。
  7. 类和模块
    • ES6引入了类的语法糖,使得面向对象编程更加简洁和易用。类可以通过extends关键字实现继承,使用super关键字调用父类的方法。此外,ES6还引入了模块化的概念,通过importexport关键字可以方便地导入和导出模块。
  8. Symbol类型
    • ES6新增了一种原始数据类型Symbol,每个Symbol类型的值都是独一无二的。这可以用于作为对象的唯一标识符,以避免属性名的冲突。
  9. Map和Set
    • ES6引入了MapSet两种新的数据结构。Map对象保存键值对,并且任何值(对象或原始值)都可以作为一个键或一个值。Set对象类似于数组,但成员的值都是唯一的,没有重复的值。
  10. Promise对象
    • Promise是异步编程的一种解决方案,它代表了一个最终可能可用(也可能不可用)的值或异步操作的最终完成(或失败)及其结果值。通过使用Promise,可以更好地组织异步代码,避免回调地狱(callback hell)的问题。

这些新特性使得ES6在语法和功能上都有了很大的提升,使得JavaScript成为更加强大和灵活的编程语言。

2. var、let、const 的区别

在 JavaScript 中,varletconst 是用于声明变量的关键字,但它们之间存在一些重要的区别。以下是它们之间的主要差异:

  1. 作用域(Scope)
    • var:具有函数作用域(在ES6之前)。这意味着在函数内部声明的var变量在函数外部是不可见的,但在同一函数内的任何地方都是可见的。如果在函数外部声明,它将成为全局变量。
    • letconst:具有块级作用域(block scope)。这意味着它们只在最近的封闭花括号 {}(例如函数体、循环体或任何代码块)内有效。
  2. 变量提升(Variable Hoisting)
    • var:存在变量提升(hoisting)现象。这意味着即使你在函数或代码块的后面部分声明了一个var变量,它也会被视为在函数或代码块的顶部就已经声明了(只是没有初始化)。
    • letconst:不存在变量提升。这意味着在声明之前,你不能引用这些变量(否则会导致引用错误)。
  3. 重新声明
    • var:允许在同一作用域内多次声明同一个变量(但这样做通常是不好的编程实践)。
    • let:允许在同一作用域内多次声明同一个变量,但会产生语法错误(在严格模式下)。
    • const:不允许重新声明,也不允许重新赋值。
  4. 赋值
    • varlet:允许重新赋值。
    • const:声明时必须赋值,且之后不允许重新赋值(但如果你声明的是一个对象或数组,你可以修改其内部属性或元素)。
  5. 暂时性死区(Temporal Dead Zone, TDZ)
    • var:不存在TDZ。
    • letconst:在声明之前的区域被称为暂时性死区(TDZ)。在这个区域内引用这些变量会导致引用错误。
  6. 全局声明
    • var:在全局作用域中声明时,会创建一个全局变量(这通常是不好的做法)。
    • letconst:在全局作用域中声明时,它们不会成为全局对象的属性(在浏览器中,全局对象是window)。因此,它们不会意外地创建全局变量。

总的来说,letconst 提供了比 var 更严格和更可预测的作用域和生命周期控制,因此在现代 JavaScript 编程中更受欢迎。通常,我们推荐尽可能使用 letconst,并在确实需要改变变量值时选择 let,而在知道变量的值在声明后不会改变时选择 const

3. Set、Map、WeakSet、WeakMap