JavaScript基础知识
1. ES6 新增特性
ECMAScript 6(简称ES6)为JavaScript语言带来了许多新的特性和改进,使得JavaScript编程更加方便、高效和优雅。以下是ES6中的一些主要新特性:
- 块级作用域:
- ES6引入了
let
和const
关键字,用于在块级作用域中声明变量。与var
不同,let
和const
声明的变量只在当前代码块内有效,避免了变量提升和全局命名冲突的问题。
- ES6引入了
- 箭头函数:
- 箭头函数是ES6中一种新的函数声明方式,使用箭头(
=>
)取代传统的function
关键字。箭头函数具有更简洁的语法,并且自动绑定了上下文(即this
的值),解决了回调函数中this
指向问题。
- 箭头函数是ES6中一种新的函数声明方式,使用箭头(
- 解构赋值:
- 解构赋值允许从数组或对象中提取值,并赋值给变量。在ES6中,可以使用解构赋值语法快速获取数组或对象中的元素,从而简化了代码编写和数据交换。
- 默认参数:
- ES6允许在函数定义时为参数提供默认值。如果调用函数时未传递某个参数,将使用默认值。这可以简化函数的使用,并且可以传递部分参数而不是全部参数。
- 扩展运算符:
- 扩展运算符(
...
)可以将数组或对象展开,提取出其中的元素。在函数调用或数组和对象字面量中,使用扩展运算符可以将数组或对象展开成独立的元素,或将多个元素合并成数组或对象。
- 扩展运算符(
- 模板字符串:
- 模板字符串是一种更方便的字符串拼接方式,使用反引号(``)定义字符串,并可以在其中插入变量和表达式,提高了代码的可读性和可维护性。
- 类和模块:
- ES6引入了类的语法糖,使得面向对象编程更加简洁和易用。类可以通过
extends
关键字实现继承,使用super
关键字调用父类的方法。此外,ES6还引入了模块化的概念,通过import
和export
关键字可以方便地导入和导出模块。
- ES6引入了类的语法糖,使得面向对象编程更加简洁和易用。类可以通过
- Symbol类型:
- ES6新增了一种原始数据类型
Symbol
,每个Symbol
类型的值都是独一无二的。这可以用于作为对象的唯一标识符,以避免属性名的冲突。
- ES6新增了一种原始数据类型
- Map和Set:
- ES6引入了
Map
和Set
两种新的数据结构。Map
对象保存键值对,并且任何值(对象或原始值)都可以作为一个键或一个值。Set
对象类似于数组,但成员的值都是唯一的,没有重复的值。
- ES6引入了
- Promise对象:
- Promise是异步编程的一种解决方案,它代表了一个最终可能可用(也可能不可用)的值或异步操作的最终完成(或失败)及其结果值。通过使用Promise,可以更好地组织异步代码,避免回调地狱(callback hell)的问题。
这些新特性使得ES6在语法和功能上都有了很大的提升,使得JavaScript成为更加强大和灵活的编程语言。
2. var、let、const 的区别
在 JavaScript 中,var
、let
和 const
是用于声明变量的关键字,但它们之间存在一些重要的区别。以下是它们之间的主要差异:
- 作用域(Scope):
var
:具有函数作用域(在ES6之前)。这意味着在函数内部声明的var
变量在函数外部是不可见的,但在同一函数内的任何地方都是可见的。如果在函数外部声明,它将成为全局变量。let
和const
:具有块级作用域(block scope)。这意味着它们只在最近的封闭花括号{}
(例如函数体、循环体或任何代码块)内有效。
- 变量提升(Variable Hoisting):
var
:存在变量提升(hoisting)现象。这意味着即使你在函数或代码块的后面部分声明了一个var
变量,它也会被视为在函数或代码块的顶部就已经声明了(只是没有初始化)。let
和const
:不存在变量提升。这意味着在声明之前,你不能引用这些变量(否则会导致引用错误)。
- 重新声明:
var
:允许在同一作用域内多次声明同一个变量(但这样做通常是不好的编程实践)。let
:允许在同一作用域内多次声明同一个变量,但会产生语法错误(在严格模式下)。const
:不允许重新声明,也不允许重新赋值。
- 赋值:
var
和let
:允许重新赋值。const
:声明时必须赋值,且之后不允许重新赋值(但如果你声明的是一个对象或数组,你可以修改其内部属性或元素)。
- 暂时性死区(Temporal Dead Zone, TDZ):
var
:不存在TDZ。let
和const
:在声明之前的区域被称为暂时性死区(TDZ)。在这个区域内引用这些变量会导致引用错误。
- 全局声明:
var
:在全局作用域中声明时,会创建一个全局变量(这通常是不好的做法)。let
和const
:在全局作用域中声明时,它们不会成为全局对象的属性(在浏览器中,全局对象是window
)。因此,它们不会意外地创建全局变量。
总的来说,let
和 const
提供了比 var
更严格和更可预测的作用域和生命周期控制,因此在现代 JavaScript 编程中更受欢迎。通常,我们推荐尽可能使用 let
和 const
,并在确实需要改变变量值时选择 let
,而在知道变量的值在声明后不会改变时选择 const
。