ES6新特性
ES6(ECMAScript 2015)是 JavaScript 的一个重要版本,引入了许多新的语法和功能,增强了语言的表达能力和开发体验。以下是 ES6 中一些重要的新特性的全面总结:
let
和 const
是新的变量声明关键字,用于定义块级作用域的变量。let
允许变量被重新赋值,而 const
则定义一个不可变的常量。this
值。适用于简短的函数和回调函数。...
可以将数组或对象展开为单独的元素或属性,方便进行数组合并、函数参数传递等操作。import
和 export
关键字,支持模块化编程,让代码更结构化和可维护。Symbol
是一种新的数据类型,用于创建唯一的属性键。Map
和 Set
是新的数据结构,分别用于键值对和集合。- Symbol:
Symbol
是 ES6 中引入的一种新的原始数据类型,用于创建独一无二的值。每个通过Symbol()
创建的值都是唯一的,不会与其他值相等。Symbol
可以用作对象属性的键,用于避免命名冲突。const uniqueSymbol = Symbol('description'); // 创建一个带有描述的 Symbol
const obj = {
[uniqueSymbol]: 'some value'
};
- Map:
Map
是一种新的数据结构,它是一种键值对的集合,与对象不同,Map
的键可以是任何类型的值,包括对象、函数等,而不仅仅是字符串。Map
的键值对在插入顺序上保持有序。const map = new Map();
map.set('key1', 'value1');
map.set('key2', 'value2');
console.log(map.get('key1')); // 输出 'value1'
console.log(map.size); // 输出 2
- Set:
Set
是一种类似于数组的数据结构,但它的值是唯一的,不允许重复。它提供了一种存储无重复值的集合的方式。const set = new Set();
set.add('value1');
set.add('value2');
set.add('value1'); // 重复的值不会被添加
console.log(set.has('value1')); // 输出 true
console.log(set.size); // 输出 2
Math
和 Number
对象的方法现在以模块化的方式提供,可以通过 Math.xxx
和 Number.xxx
来访问。数组
ES6在数组上新增了以下几种方法:
js
let arrayLike = {0: 'a', 1: 'b', length: 2}
let arr = Array.from(arrayLike, x => x.toUpperCase())
// ['A', 'B']
js
let arr = Array.of(1, 2, 3)
// [1, 2, 3]
js
let arr = [1, 2, 3]
let found = arr.find(x => x > 1) // 2
js
let arr = [1, 2, 3]
let index = arr.findIndex(x => x > 1) // 1
js
let arr = new Array(3).fill(0) // [0, 0, 0]
js
let arr = [1, 2, 3, 4]
arr.copyWithin(2, 0, 2) // [1, 2, 1, 2]
js
let arr = [1, 2, 3]
arr.includes(2) // true
js
let arr = [1, [2, 3]]
arr.flat() // [1, 2, 3]
js
let arr = [1, 2, 3]
arr.flatMap(x => [x * 2]) // [2, 4, 6]
js
let arr = [1, 2, 3]
arr.at(-1) // 3
对象
ES6 在对象的语法和 API 上也引入了一些重要的改进。以下是 ES6 在对象上新增的一些语法和 API 的详细总结:
const key = 'name';
const person = {
[key]: 'John',
age: 30
};
function
关键字省略。
const person = {
name: 'John',
sayHello() {
console.log(`Hello, ${this.name}!`);
}
};
Object.assign(target, ...sources)
:这个静态方法用于将一个或多个源对象的属性复制到目标对象,可以用于对象的合并。
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const mergedObj = Object.assign({}, obj1, obj2);
Object.keys(obj)
、Object.values(obj)
和 Object.entries(obj)
:这些静态方法分别返回一个数组,用于遍历对象的键、值和键值对(键和值组成的数组)。Object.getOwnPropertyDescriptor(obj, prop)
和 Object.defineProperty(obj, prop, descriptor)
:getOwnPropertyDescriptor
方法获取对象属性的描述符,defineProperty
方法用于修改或定义对象属性的描述符。Object.setPrototypeOf(obj, prototype)
和 Object.getPrototypeOf(obj)
:setPrototypeOf
方法设置对象的原型,getPrototypeOf
方法获取对象的原型。Object.is(value1, value2)
:这个静态方法用于比较两个值是否严格相等,类似于 ===
运算符,但对于 NaN 和 +0/-0 有不同的结果。Object.getOwnPropertySymbols(obj)
:这个静态方法返回一个数组,包含对象中的所有符号属性。Object.freeze(obj)
、Object.seal(obj)
和 Object.preventExtensions(obj)
:这些静态方法用于分别冻结对象、密封对象(阻止添加和删除属性)、阻止对象扩展(阻止添加属性)。Object.fromEntries(iterable)
:这个静态方法用于将键值对的可迭代对象转换为一个对象。