在JavaScript的最新版本中,引入了许多新特性,这些特性极大地丰富了语言的功能,提高了开发效率。本文将介绍一些最实用的新语言元素,它们对于各种基本编程任务都非常有用。
在ES5及之前的版本中,JavaScript不允许声明块级作用域变量。即使在花括号内声明的变量,也具有函数作用域或全局作用域。ES6引入了let
和const
关键字,允许开发者声明具有更细粒度作用域的局部变量,这有助于避免意外的变量重复,并使代码更加模块化。
使用let
声明的变量可以被重新赋值,而使用const
声明的变量则不可变,即它们是常量。建议尽可能使用const
来声明那些不需要改变值的变量。如果变量需要在块内重新赋值,或者这种需求不明确,那么应该使用let
来声明块级作用域变量,或者使用var
来声明全局或函数作用域变量。
箭头函数提供了一种更简洁的函数表达式语法,并允许在函数体内使用外部环境(闭包)中的this
变量。
例如,使用箭头函数可以简化数组的映射操作:
let evens = [0, 2, 4, 6, 8];
let odds = evens.map(v => v + 1); // [1, 3, 5, 7, 9]
箭头函数还可以简化对数组元素的迭代操作,同时保持this
指向当前对象:
this.nums = [1, 3, 5, 8, 10, 12, 15, 17];
this.fives = [];
this.nums.forEach(v => {
if (v % 5 === 0) this.fives.push(v);
});
for-of循环可以遍历可迭代对象,如字符串、数组、类数组对象(例如内置的arguments
对象或HTMLCollections
和NodeList
的实例)以及TypedArray
、Map
和Set
的实例,甚至是用户定义的可迭代对象。
const divElems = document.getElementsByTagName("div");
for (let dEl of divElems) {
console.log(dEl.id);
}
for-of循环通常比传统的for循环更方便,尤其是当不需要计数器变量时。与forEach循环不同,for-of循环允许遍历HTMLCollections,并且可以使用break
语句中断循环。
模板字符串使用反引号(`)包围,而不是双引号或单引号,允许以简洁的语法组合固定文本部分和变量/表达式。
const classValues = "card important";
const name = "Joker";
const htmlTemplate = `
Hello ${name}!
`;
展开操作符(...)允许在函数调用或数组元素的期望位置展开可迭代集合的元素,或者在期望名称-值对的地方展开JS对象的插槽。
let nums = [3, 4, 5], otherNums = [1, 2, ...nums]; // [1, 2, 3, 4, 5]
let numsClone = [...nums]; // 克隆数组
let book = {title: "JavaScript: The Good Parts"};
let bookClone = {...book}; // 克隆对象
解构赋值提供了一种简洁的语法,用于将JS对象的属性值或JS数组的元素分配给相应的变量。
var point1 = [10, 5];
var [x, y] = point1;
console.log(`x = ${x} | y = ${y}`);
// x = 10 | y = 5
var person1 = {firstName: "James", lastName: "Bond"};
var {first, last} = person1;
console.log(`first:${first} | last:${last}`);
// first:"James" | last:"Bond"
解构赋值在处理函数返回多个值、交换两个变量、克隆数组以及简化带有参数记录的函数调用时非常有用。
模块是受命名空间保护的库,它们明确导出其他模块和网页可以使用的变量、函数和类名。模块需要从其他模块显式导入名称,而网页可以使用特殊的脚本元素加载模块。
// lib/math.js
export function sum(x, y) {
return x + y;
}
export var pi = 3.141593;
// 另一个JS文件
import * as math from "./lib/math.js";
console.log("2π = " + math.sum(math.pi, math.pi));
// 或者导入特定元素
import {sum, pi} from "./lib/math.js";
console.log("2π = " + sum(pi, pi));
在HTML文件中,可以使用以下方式加载模块:
<script type="module" async="async" src="module1.js"></script>
<script type="module" async="async" src="module2.js"></script>
注意,由于异步加载,无法保证哪个模块会先执行。