一、let const
五个共同特点
- 不允许重复声明
- 块级作用域
- 不存在变量提升
- 不影响作用域链
- 暂时性死区---在代码块内,使用let/const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
const 特殊性
- 声明必须赋初始值;
- 标识符一般为大写(习惯);
- 值不允许修改;
- 指向的那个内存地址所保存的数据不得改动。
- 对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。
- 对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
二、解构赋值
允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
- 数组的解构赋值
- 对象的解构赋值
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 函数参数的解构赋值
1、数组的解构赋值
数组的元素是按次序排列的,变量的取值由它的位置决定
let [a, b, c] = [1, 2, 3];
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
默认值
let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
2、对象的解构赋值
对象的属性没有次序,变量必须与属性同名,才能取到正确的值
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined
let { first: f, last: l } = { first: 'hello', last: 'world' }
f // 'hello'
l // 'world
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
默认值
var {x, y = 5} = {x: 1};
x // 1
y // 5
注意
(1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。
// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error
// 正确的写法
let x;
({x} = {x: 1});
3、字符串的解构赋值
- 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
- 类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
let {length : len} = 'hello';
len // 5
4、数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
5、函数参数的解构赋值
三、字符串扩展
| 序号 | 写法 | 解释 |
|---|---|---|
| 1 | Unicode 表示法 | 允许采用\uxxxx形式表示一个字符 |
| 2 | for of 遍历 | 类似于for in ,可以便利原型链上的内容 |
| 3 | 字符串 |
模板字符串:可换行,${}传参 |
| 4 | String.fromCodePoint()、ES5 fromCardCode | 从 Unicode 码点返回对应字符 |
| 5 | String.raw() | 返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串 |
| 6 | 实例方法:codePointAt()、ES5 cardCodeAt() | 字符转code码 |
| 7 | 实例方法:at(index) | 查看指定位置的字符 |
| 8 | 实例方法:includes(), startsWith(), endsWith() | 匹配是否存在 |
| 9 | 实例方法:repeat() | 将原字符串重复n次 |
| 10 | 实例方法:padStart(),padEnd() | 补全 |
| 11 | 实例方法:trimStart(),trimEnd() | 消除空格 |
| 12 | 实例方法:replaceAll() | 替换所有匹配的内容 |
1、Unicode 表示法
- 允许采用\uxxxx形式表示一个字符
- 限于码点在\u0000~\uFFFF之间的字符
"\u{20BB7}" // "