ES6
ES6
ES6 首次命名出现是在2015年,是JavaScript版本历史上的第二次重大修订版本,上一次是2009年修订的版本。
目前对于2015年修订的版本称为: ES6
或者 ECMAScript 6
,例如:
ES5
:ECMAScript 2009ES6
:ECMAScript 2015
let关键字
let关键字允许在块级作用范围内定义变量
const x = 10
// 这里打印出来,x值为100
{
const x = 30
// 这里打印出来,x值为30
}
// 这里打印出来,x值为100
const关键字
const关键字用来声明常量,本质上是值不变的“let变量”。const常量和let变量类似,都是JavaScript的var变量。
随着ES6的普及,不再建议使用var关键字来进行声明。防止出现作用域污染
const x = 100
// 这里打印出来,x值为100
{
const x = 40
// 这里打印出来,x值为40
}
// 这里打印出来,x值为100
箭头函数
箭头函数支持用一种简单、精炼的方式来定义函数,使得不需要使用function、return关键字,就能定义函数。例如:
// ES5
const result = function (x, y) {
return x + y
}
// ES6
const result1 = (x, y) => x + y
箭头函数
没有自己的this对象。箭头函数不太适合定义对象方法。箭头函数
不会被提升。它们必须在使用之前定义。- 使用
const
关键字比使用var
关键字更安全,因为函数表达式始终是常量值。 - 如果函数是单个语句,则只能省略关键字和大括号。
拓展运算符
...
扩展运算符支持对可迭代对象(例如:数组、对象)进行更加灵活的操作,例如:
const num = [1, 2, 3]
const bigNum = [100, 200, 400]
// 数组内容连接,类似concat操作
const data = [...num, ...bigNum]
同时,拓展运算符好支持函数传参,例如:
const nums = [21, 45, 33, 67, 89]
const maxValue = Math.max(...nums)
for...of循环
JavaScript
的 for/of
语句支持循环遍历可迭代对象的值。这里的可迭代的数据结构支持数组、字符串、映射、节点列表等。
该for/of
循环具有以下语法:
// 循环遍历数组
const students = ['Tom', 'Lisa']
let stuResult = ''
for (const stu of students) {
stuResult += `${stu} `
}
// 循环遍历字符串
const language = 'JavaScript'
let result = ''
for (const str of language) {
result += `${str} `
}
Map映射
Map
(映射)是一种常用的数据结构吗,用于存储键值对
的集合
相关API:
new Map()
:创建新的Map
对象set()
:设置Map
中键的值get()
:获取Map
中某个键的值clear()
:从Map
中删除所有元素delete()
:删除由键指定的Map
元素has()
:如果Map
中存在键则返回 trueforEach()
:为Map
中的每个键/值对调用回调entries()
:返回具有Map
中的[key, value]
对的迭代器对象keys()
:返回带有Map
中的键的迭代器对象values()
:返回Map
中值的迭代器对象size
:返回Map
元素的数量。注意是属性,不是方法
/**
* 创建学生-年龄关系映射
* - 存储键值对
*/
const studentAgeMap = new Map([
['Tom', 20],
['Lisa', 18],
])
/**
* 往集合中增加映射关系
*/
studentAgeMap.set('fairy', 24)
/**
* 根据映射关键字获取值
*/
const age = studentAgeMap.get('fairy')
// 打印
console.log(age)
/**
* 返回集合中元素个数
*/
const size = studentAgeMap.size
console.log(size)
/**
* 根据键删除映射关系
*/
studentAgeMap.delete('fairy')
/**
* 判断键是否存在
*/
studentAgeMap.has('fairy')
/**
* 清空Map
*/
studentAgeMap.clear()
/**
* 判断类型,返回对象object
*/
const mapType = typeof studentAgeMap
// 打印
console.log(mapType)
/**
* 判断实例,返回true
*/
const isMap = studentAgeMap instanceof Map
// 打印
console.log(isMap)
/**
* 循环处理
*/
studentAgeMap.forEach((value, key, originMap) => {
console.log(key, value, JSON.stringify(originMap))
})
/**
* 获取所有的键
*/
studentAgeMap.keys()
/**
* 获取所有的键、值
*/
studentAgeMap.entries()
/**
* 获取所有的值
*/
studentAgeMap.values()
Set集合
JavaScript
的Set
是一个集合,里面的元素具有唯一性,每个元素只允许出现一次。Set数据结构可以保存任何数据类型的数据值。
相关API:
new Set()
: 创建Set
集合add()
: 往Set
集合中添加元素delete()
: 移除Set
集合中的元素has()
: 判断元素是否在Set
集合中clear()
: 清除Set
集合中的所有元素forEach()
: 遍历Set
集合,执行回调方法values()
: 返回Set
集合中所有的值keys()
: 返回Set
集合中所有的键entries()
: 以[键,值]
的方式返回Set
集合中的所有数据size
:返回Set集合中元素的数量,注意是属性,不是方法
/**
* 使用数组创建Set集合
*/
const stuSet = new Set([1, 2, 3])
// 打印
console.log(stuSet)
/**
* 利用add()方法创建Set集合
*/
const studentSet = new Set()
studentSet.add(1)
studentSet.add(2)
studentSet.add(3)
/**
* 列出集合中所有值
*/
let res = ''
studentSet.forEach((value) => {
res += value
})
console.log(res)
/**
* Set集合中没有Key的概念
* keys()方法和values()方法效果一样
*/
studentSet.values()
需要注意的是,Set集合本质上是对象,可以使用typeof关键字判断,例如:
const stuSet = new Set([1, 2, 3])
// 返回对象
typeof stuSet
// 返回true
stuSet instanceof Set
Class类
JavaScript
的类是JavaScript
对象的模板,可以使用class
关键字创建类。类可以构造函数来创建对象,例如:
/**
* 创建Student类
*/
class Student {
constructor(name: string, age: number) {
this.name = name
this.age = age
}
}
// 创建对象
const student = new Student('Tom', 18)
用类创建出来的对象,与类有本质的区别。JavaScript的类只是对象的模板。
Promise对象
Symbol类型
JavaScript
符号类型是一种原始数据类型,就像数字、字符串或布尔值一样,代表一个唯一的隐藏标识符,其他代码无法访问。
如果不同的编码人员想要将 student.id
属性添加到属于第三方代码的 student
对象,他们可以混合彼此的值, 可以使用Symbol()
创建唯一标识符,解决了这个问题。例如:
// 定义student对象
const student = {
name: 'Tom',
age: 18,
}
// 创建唯一标识符
const id = Symbol('id')
person[id] = 100
// 返回100
person[id]
// 返回undefined
person.id
默认参数
ES6允许对函数参数设置默认值,例如:
/**
* 两个值求和
*/
function add(x, y = 10) {
// 当参数y没有传值时,默认为10
return x + y
}
// 返回15
add(5)
剩余参数
剩余参数 ...
允许函数将不定数量的参数视为数组,例如:
/**
* 参数值累加,不限制参数个数
* @param args
*/
function sum(...args) {
let sum = 0
for (const arg of args)
sum += arg
return sum
}
// 计算参数累加和
const reult = sum(4, 9, 16, 25, 29, 100, 66, 77)
字符串新增方法
对于String类型的变量,ES6新增三个方法:
includes()
:来判断字符串中是否包含指定值startsWith()
:判断字符串是否以指定值开头endsWith()
:判断字符串是否以指定值结尾
includes()
includes()
方法可以用来判断字符串中是否包含指定值,存在返回:true
,否则返回:false
const text = 'Hello world!'
// 返回true
text.includes('world')
startsWith()
startsWith()
方法可以判断字符串是否以指定值开头,存在返回:true
,否则返回:false
const text = 'Hello world!'
// 返回true
text.startsWith('hello')
endsWith()
endsWith()
方法可以判断字符串是否以指定值结尾,存在返回:true
,否则返回:false
const text = 'Hello world!'
// 返回false
text.endsWith('world')
数组新增方法
Array.from()
Array.from()
方法支持从任何迭代对象或者带有length
属性的对象中返回一个数组对象,例如:
// 返回 [A,B,C,D,E,F,G]
Array.from('ABCDEFG')
keys()
返回带数组键的数组迭代对象,例如:
// 定义数组
const students = ['Lisa', 'Tom']
const keys = students.keys()
// 遍历keys对象
let text = ''
for (const x of keys) {
text += `${x}---`
}
console.log(text)
上面例子的keys()
函数,数组的角标0、1、2...
,所以返回的迭代对象中的为number
类型。
find()
find()
方法返回满足回调函数的第一个数组元素的值,例如:
const numbers = [4, 9, 16, 25, 29]
// 获取满足回调函数的一个数组元素值
const firstNum = numbers.find((value, index, array) => {
return value > 20
})
findIndex()
findIndex()
方法返回满足回调函数的第一个数组元素的索引,例如:
const numbers = [4, 9, 16, 25, 29]
// 获取满足回调函数的一个数组元素值的索引(角标)
const firstNum = numbers.find((value, index, array) => {
return value > 20
})
注意:findIndex()
方法返回的是索引,find()
方法返回的是数组中满足条件的第一个元素值
Math新增方法
Math对象上新增5个方法:
Math.trunc()
Math.sign()
Math.cbrt()
Math.log2()
Math.log10()
Math.trunc()
返回数字的整数部分,例如:
// 返回7
Math.trunc(7.8)
// 返回6
Math.trunc(6.2)
// 返回6
Math.trunc(6.5)
// 返回4
Math.trunc(4.3)
// 返回-8
Math.trunc(-8.4)
Math.sign()
返回数字为负数、空、正数,例如:
// 返回-1 代表负数
Math.sign(-8)
// 返回0
Math.sign(0)
// 返回1 代表正数
Math.sign(6)
Math.cbrt()
计算参数的立方根,类似解方程,例如:
// 返回0
Math.cbrt(0)
// 返回3
Math.cbrt(27)
// 返回-1
Math.cbrt(-1)
Math.log2()
计算参数以 2 为底的对数,类似于对数方程,例如:
// 返回0
Math.log2(1)
// 返回2
Math.log2(4)
Math.log10()
计算参数以 10 为底的对数,类似于对数方程,例如:
// 返回0
Math.log10(1)
// 返回1
Math.log10(10)
// 返回2
Math.log10(100)
Number对象
Number
对象新增三个属性:
EPSILON
:是JavaScript
能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。可以用来确认浮点运算是否精确MIN_SAFE_INTEGER
: 最小安全整数MAX_SAFE_INTEGER
: 最大安全整数
Number
对象新增两个方法:
Number.isInteger()
Number.isSafeInteger()
Number.isInteger()
用来判断是否为整数,例如:
// 返回true
Number.isInteger(100)
// 返回false
Number.isInteger(70.5)
Number.isSafeInteger()
用来判断是否为安全整数
,这里的安全指的是在JS的精度范围内,例如:
// 返回true
Number.isSafeInteger(10)
// 返回false,例如:99999999999999999
全局方法
isFinite()
全局方法,判断是否为有限数
,如果参数是无限数
或不是数字类型
,函数返回false
,例如:
// 返回false
Number.isFinite(60 / 0)
// 返回true
Number.isFinite(100 / 2)
isNaN()
全局方法,用来确认变量不是Number
类型,函数可理解为is not a Number
,例如:
// 返回true
Number.isNaN('hello')
// 返回false
Number.isNaN(100)
对象上entries()方法
在Object
对象上新增entries()
方法,用来获取 带有键/值对
的 数组类型的 迭代(Iterator)对象,例如:
const students = ['Tom', 'Lisa']
const stu = students.entries()
// 循环
for (const s of stu) {
// 数据形式:[index,value]
console.log(s)
}
模块导入
- 解构到导入
- 导入默认
在模块中导出,可以采用默认导出,例如:
export default {
name: 1
}
对此,导入则需要通过变量接收默认对象,例如:
import defaultExport from './export.ts'
// 打印name属性
console.log(defaultExport.name)
同样的。导出还可以指定变量导出,例如:
export const name = 1
对于指定变量导出,则可以通过解构的方式,例如:
// 直接解构,或者采用变量接收后解构
import { name } from './export.ts'
console.log(name)