let 和 const
var 关键字定义变量的特点:
- 可以重复定义
- 不能定义常量
- 不支持块级作用域
let 的特点
- 不可以重复定义
- 变量不能提升,在变量定义之前,不能使用
- 在大括号当中定义的变量(块级作用域中),在作用域外无法访问
- 解决一些 ES5 当中需要闭包实现的功能,比如:每隔 1 秒循环输出一个当前的值
const 的特点
- 常量一旦定义,就不能被修改
- 如果常量的值是一个引用类型,引用对象的属性还是可以修改的
结构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为结构。
let arr = [1,2,3];
let [a,b,c] = arr;
let [,,m] = arr;
// m = 3
let [d,...e] = arr;
// d = 1
// e = [2,3]
let [f,g,...h] = [1];
// f = 1
// g = undefined
// h = []
let obj = {
name:"mmcai",
age:28,
long:165
}
let {name,age,long} = obj;
// name = "mmcai"
// age = 28
// long = 165
let {name:myName,age:myAge} = obj;
// myName = "mmcai"
// myAge = 28
let {name,...O} = obj;
// name = "mmcai"
// O = {
age:28,
long:165
}
特点
- 可以通过“模式匹配”的写法从数组或者对象中取出来值,直接赋值给某变量
- 不完全解构,等号左边的模式,只匹配右边的一部分
- 解构赋值可以指定默认值,如果从等号右边取出来的值是 undefined,就会使用指定的默认值
- 数组的解构赋值要完全按照数组的秩序取值,对象不需要
- 如果解构赋值等号右边是布尔或者数值,会先转为对象
- 字符串也可以执行结构赋值,字符串结构赋值的时候,被当做类数组的对象
- 函数的参数也可以使用解构默认赋值,往往还会设置默认值,当参数没有的时候,直接使用默认值
-
以下三种解构赋值不能使用圆括号
- 变量生命语句
- 函数参数
- 赋值语句的模式
用途
- 交换变量的值
- 从函数返回多个值
- 函数参数的定义
- 提取 JSON 数据
- 函数参数的默认值
- 遍历 Map 结构
- 输入模块的指定方法
字符串扩展
- 字符的 Unicode 表示法
- 使用 for…of 循环遍历字符串,ES6 字符串添加了遍历器接口 Iterator
- 模板字符串,ES6 自带模板解析引擎
- 模板字符串可以直接跟在函数名后面,该函数将被调用来处理这个模板字符串
模板字符串
ES6 当中字符串使用反引号(`) 标识,字符串当中嵌入变量可以通过 ${} 来添加,比如:
const {name,age} = {
name:"mmcai",
age:28
}
const str = ` 我的名字是 ${name}, 我今年 ${age}岁了 `;
其实模板字符串,就是 ES6 本身自带了一个模板引擎,来对特殊的内容进行解析,大概原理如下:
let compile = (desc){return desc.replace(/\$\{([^}]+)\}/g,(matched,key)=>{return eval(key);
}
}
- 模板字符串使用 ` 标识,使用 ${}包括嵌入的变量
- 模板字符串可以换行
- 当我们需要自定义模板引擎的时候,可以使用标签模板,通过函数来实现
字符串新增方法
- includes——判断字符串中是否包含某字符串,返回布尔值
- startsWith——字符串头部是否有某字符串,返回布尔值
- endsWith——字符串结尾是否有某字符串,返回布尔值
- repeat——返回一个重复了 n 次的新字符串。
- trimStart——消除字符串头部空格
- trimEnd——消除尾部空格
- padStart——从头部补全字符串
- padEnd——从尾部补全字符串