- 1.let 和 const
- 2.变量的解构赋值
- 3.字符串的扩展
- 4.字符串的新增方法
- String.fromCodePoint())">4.1 String.fromCodePoint())
- String.raw())">4.2String.raw())
- 实例方法:codePointAt())">4.3实例方法:codePointAt())
- 实例方法:normalize())">4.4实例方法:normalize())
- 实例方法:includes(), startsWith(), endsWith(),%20startsWith(),%20endsWith())">4.5实例方法:includes(), startsWith(), endsWith(),%20startsWith(),%20endsWith())
- 实例方法:repeat())">4.6实例方法:repeat())
- 实例方法:padStart(),padEnd()%EF%BC%8CpadEnd())">4.7实例方法:padStart(),padEnd()%EF%BC%8CpadEnd())
- 实例方法:trimStart(),trimEnd()%EF%BC%8CtrimEnd())">4.8实例方法:trimStart(),trimEnd()%EF%BC%8CtrimEnd())
- 实例方法:matchAll())">4.9实例方法:matchAll())
- 实例方法:replaceAll())">4.10实例方法:replaceAll())
- 5.正则的扩展
- 6.数值的扩展
- 7.函数的扩展
1.let 和 const
1.1 let
1.1.1 let声明的变量,只在let命令所在的代码块有效
1.1.2 let不存在变量提升
1.1.3 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭 作用域。凡是在声明之前就使用这些变量,就会报错
1.1.4 let不允许在相同作用域内,重复声明同一个变量。
1.1.5 let实际上为 JavaScript 新增了块级作用域。
1.1.6 ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
1.1.7 ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
1.1.8 浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于var声明的变量。
1.1.9 考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数。如果确实需要,也应该写成函数表达式,而不是函数声明语句。
1.2 const
1.2.1const声明一个只读的常量。一旦声明,常量的值就不能改变。
2.变量的解构赋值
2.1 数组
let [a, b, c] = [1, 2, 3];
只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。
解构赋值允许指定默认值
2.2 对象
let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
与数组一样,解构也可以用于嵌套结构的对象。2.3字符串
let obj = {p: ['Hello',{ y: 'World' }]};let { p: [x, { y }] } = obj;x // "Hello"y // "World"
2.4数值和布尔值
2.5函数参数
function add([x, y]){return x + y;}add([1, 2]); // 3
2.6圆括号问题
3.字符串的扩展
3.1字符的Unicode表示法
‘\uoo61’ —> ‘a’
这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。
"\uD842\uDFB7"// "𠮷""\u20BB7"// " 7"
ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。
"\u{20BB7}"// "𠮷""\u{41}\u{42}\u{43}"// "ABC"let hello = 123;hell\u{6F} // 123'\u{1F680}' === '\uD83D\uDE80'// true
3.2 字符串的遍历器接口
使得字符串可以被for...of循环遍历。
for (let codePoint of 'foo') {console.log(codePoint)}// "f"// "o"// "o"
4.字符串的新增方法
4.1 String.fromCodePoint())
可以识别大于0xFFFF的字符,弥补了String.fromCharCode()方法的不足。在作用上,正好与下面的codePointAt()方法相反。
String.fromCodePoint(0x20BB7)// "𠮷"String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'// true
4.2String.raw())
该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。
String.raw`Hi\n${2+3}!`// 实际返回 "Hi\\n5!",显示的是转义后的结果 "Hi\n5!"String.raw`Hi\u000A!`;// 实际返回 "Hi\\u000A!",显示的是转义后的结果 "Hi\u000A!"
4.3实例方法:codePointAt())
ES6 提供了codePointAt()方法,能够正确处理 4 个字节储存的字符,返回一个字符的码点。
4.4实例方法:normalize())
ES6 提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。
4.5实例方法:includes(), startsWith(), endsWith(),%20startsWith(),%20endsWith())
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
4.6实例方法:repeat())
repeat方法返回一个新字符串,表示将原字符串重复n次。'x'.repeat(3) // "xxx"'hello'.repeat(2) // "hellohello"'na'.repeat(0) // "
4.7实例方法:padStart(),padEnd()%EF%BC%8CpadEnd())
ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。4.8实例方法:trimStart(),trimEnd()%EF%BC%8CtrimEnd())
ES2019 对字符串实例新增了trimStart()和trimEnd()这两个方法。它们的行为与trim()一致,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。4.9实例方法:matchAll())
4.10实例方法:replaceAll())
ES2021 引入了replaceAll()方法,可以一次性替换所有匹配。'aabbcc'.replaceAll('b', '_')// 'aa__cc'
5.正则的扩展
5.1RegExp 构造函数
5.2字符串的正则方法
5.3u 修饰符
5.4RegExp.prototype.unicode 属性
5.5y 修饰符
5.6RegExp.prototype.sticky 属性
5.7RegExp.prototype.flags 属性
5.8s 修饰符:dotAll 模式
5.9后行断言
5.10Unicode 属性类
5.11具名组匹配
5.12正则匹配索引
5.13String.prototype.matchAll())6.数值的扩展
6.1二进制和八进制表示法
6.2Number.isFinite(), Number.isNaN(),%20Number.isNaN())
6.3Number.parseInt(), Number.parseFloat(),%20Number.parseFloat())
6.4Number.isInteger())
6.5Number.EPSILON
6.6安全整数和 Number.isSafeInteger())
6.7Math 对象的扩展
6.8指数运算符
6.9BigInt 数据类型7.函数的扩展
7.1函数参数的默认值
7.2rest 参数
7.3严格模式
7.4name 属性
7.5箭头函数
7.6尾调用优化
7.7函数参数的尾逗号
7.8Function.prototype.toString())
7.9catch 命令的参数省略
