复习-ES6(1)

79 阅读3分钟

给大家推荐一个网站,讲的就是ES6,是大佬阮一峰写的,本文也会的实例也会按照这个网站写 ECMAScript 6 入门 - 《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》 - 书栈网 · BookStack

1.let const

1.1 let

  1. 不存在变量提升

  2. 暂时性死区

  3. 
    
    var tmp = 123;
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }
    //有些“死区”比较隐蔽,不太容易发现。
    function bar(x = y, y = 2) {
      return [x, y];
    }
    bar(); // 报错
    
  4. 不允许重复声明 --- 不允许出现两个相同的变量名

let实际上为 JavaScript 新增了块级作用域。

{
    let a = '块级作用域'
    var b = '全局作用域'
    console.log(a)//块级作用域
}
 console.log(a)//ReferenceError

1.2 const

  1. 常量的值就不能改变 如果是引用类型可以改变对象里面的值,但不能改变地址值
  2. 不存在变量提升
  3. 不允许重复声明
  4. 暂时性死区

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,反之