给大家推荐一个网站,讲的就是ES6,是大佬阮一峰写的,本文也会的实例也会按照这个网站写 ECMAScript 6 入门 - 《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》 - 书栈网 · BookStack
1.let const
1.1 let
-
不存在变量提升
-
暂时性死区
-
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; } //有些“死区”比较隐蔽,不太容易发现。 function bar(x = y, y = 2) { return [x, y]; } bar(); // 报错 -
不允许重复声明 --- 不允许出现两个相同的变量名
let实际上为 JavaScript 新增了块级作用域。
{
let a = '块级作用域'
var b = '全局作用域'
console.log(a)//块级作用域
}
console.log(a)//ReferenceError
1.2 const
- 常量的值就不能改变 如果是引用类型可以改变对象里面的值,但不能改变地址值
- 不存在变量提升
- 不允许重复声明
- 暂时性死区
2.globalThis 对象
ES2020 在语言标准的层面,引入globalThis作为顶层对象。也就是说,任何环境下,globalThis都是存在的,都可以从它拿到顶层对象,指向全局环境下的this。
3.rest参数
其实就是不知道有多少实参,就把函数参数放在一个数组里面
function test(...rest){//rest可以随便起名
console.log(rest) //[1,2,3]
}
test(1,2,3)
4.正则扩展
4.1 具名组匹配
组匹配的一个问题是,每一组的匹配含义不容易看出来,而且只能用数字序号(比如matchObj[1])引用,要是组的顺序变了,引用的时候就必须修改序号。
const RE_DATE = /(\d{4})-(\d{2})-(\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj[1]; // 1999
const month = matchObj[2]; // 12
const day = matchObj[3]; // 31
ES2018 引入了具名组匹配(Named Capture Groups),允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。 如果具名组没有匹配,那么对应的groups对象属性会是undefined。
语法 “问号 + 尖括号 + 组名”(?<year>)
const RE_DATE = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
const matchObj = RE_DATE.exec('1999-12-31');
const year = matchObj.groups.year; // 1999
const month = matchObj.groups.month; // 12
const day = matchObj.groups.day; // 31
4.2 String.prototype.matchAll()
String.prototype.matchAll()方法,可以一次性取出所有匹配。不过,它返回的是一个遍历器(Iterator),而不是数组。
const string = 'test1test2test3';
// g 修饰符加不加都可以
const regex = /t(e)(st(\d?))/g;
for (const match of string.matchAll(regex)) {
console.log(match);
}
// ["test1", "e", "st1", "1", index: 0, input: "test1test2test3"]
// ["test2", "e", "st2", "2", index: 5, input: "test1test2test3"]
// ["test3", "e", "st3", "3", index: 10, input: "test1test2test3"]
4.3 先行断言 后行断言
“先行断言”指的是,x只有在y前面才匹配,必须写成/x(?=y)/ 比如,只匹配百分号之前的数字,要写成/\d+(?=%)/。
“先行否定断言”指的是,x只有不在y前面才匹配,必须写成/x(?!y)/ 比如,只匹配不在百分号之前的数字,要写成/\d+(?!%)/。
/\d+(?=%)/.exec('100% of US presidents have been male') // ["100"]
/\d+(?!%)/.exec('that’s all 44 of them') // ["44"]
“后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=\$)\d+/。
“后行否定断言”则与“先行否定断言”相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!\$)\d+/。4
/(?<=\$)\d+/.exec('Benjamin Franklin is on the $100 bill') // ["100"]
/(?<!\$)\d+/.exec('it’s is worth about €90') // ["90"]
5. Number.isNaN和isNaN的区别
一道很常见的面试题吧 都是判断是不是NaN
Number.isNaN 用来检查一个值是否为NaN。 不会进行类型转换 传入的参数 === NaN 才会等于true
Number.isNaN(NaN) // true
Number.isNaN(15) // false
Number.isNaN('15') // false
Number.isNaN(true) // false
Number.isNaN(9/NaN) // true
Number.isNaN('true' / 0) // true
Number.isNaN('true' / 'true') // true
isNaN 用来检查一个值是否为NaN 会进行类型转换Number类型转换,如果转换不成功则是 NaN 反之 例: isNaN(Number(传入的参数))
isNaN(NaN) // true
isNaN("NaN") // true
Number.isNaN(NaN) // true
Number.isNaN("NaN") // false
Number.isNaN(1) // false
总结 Number.isNaN() 参数 全等于 NaN 才返回 true 而isNaN () 是 参数进行Number()转换 如转换不成功则为true,反之