Es6新增语法梳理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Es6新增语法梳理相关的知识,希望对你有一定的参考价值。

参考技术A 这两天项目上线,手头工作忙完了,忽然想起来面试的时候总会问到
ES6有哪些新增的语法,你了解多少?

梳理梳理吧!

现在项目中我已经基本上不会使用 var 来声明变量了,

此方法可以获得所有对象的key,返回数组包含所有对象的key

有时候不确定会给函数中传入多少个参数,可以使用展开运算符

这些都是ES6遍历数组的方法,但是有一些不同处,

用于处理数据过后返回一个新数组

用来过滤的方法
const filterArr = [1, 2, 3, 4, 5]

// 三个参数:遍历项 索引 数组本身
// 返回大于3
const filterArr2 = filterArr.filter((num, index, arr) => num > 3)
console.log(filterArr2)

// 输出:
[ 4, 5 ]

只要有一个是真,就返回真

every与some是相反的,every要每一项为真才返回真

提取对象里的属性,对象解构

数组的解构

获取对象 value 值的集合

ES6新增语法 + 内置对象扩展 + 箭头函数

ES6语法

ES 的全称是 ECMAScript , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范


一、ES6新增语法

1. let 关键字

  • 特性一 :有块级作用域
    {} 里面就是块级作用域
    let 声明的变量只在所处于的块级有效
    let 关键字声明的变量才具有块级作用域,var 没有
 // 防止循环变量变成全局变量
 for (let i = 0; i < 10; i++) {
     console.log(i)
 }
 console.log(i) // i is not defined
  • 特性二:没有变量提升
    在使用 let 关键字声明变量时, 必须先声明后使用
 console.log(a) // 报错
 let a = 100
  • 特性三:暂时性死区
    let 关键字声明的变量, 会和当前作用域绑定
 var a = 10
 if (true) {
	 console.log(a) // 报错 a is not defined
	 let a = 20
 }
  • 经典面试题
 var arr = [];
 for (var i = 0; i < 2; i++) {
     arr[i] = function () {
         console.log(i); 
     }
 }
 arr[0]();
 arr[1]();

关键点:变量 i 是全局的,函数执行时输出的都是全局作用域下的 i

 let arr = [];
 for (let i = 0; i < 2; i++) {
     arr[i] = function () {
         console.log(i); 
     }
 }
 arr[0]();
 arr[1]();

关键点:每次循环都会产生一个块级作用域,每个块级作用域中的变量 i 都是不同的,函数执行时输出的是自己上一级(循环产生的块级作用域)作用域下的 i


2. const 关键字

  • 特性一 :有块级作用域
  • 特性二 :声明时必须有初始值
 const PI // 报错
 const PI = 3.1415926
  • 特性三 :赋值后无法更改地址值
    基本数据类型 不能改
    引用数据类型 数据结构内部值 可以改
const PI = 3.14;
PI = 100; // Assignment to constant variable.

const ary = [100, 200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary); // ['a', 'b']; 
ary = ['a', 'b']; // Assignment to constant variable.

3. let const var 的区别

varletconst
函数级作用域块级作用域块级作用域
变量提升无变量提升无变量提升
值可修改值可修改值不可修改

4. 解构赋值

作用:将数组对象的成员提取并赋值给变量

  • 数组解构
 let [a, b, c] = [1, 2, 3];
 console.log(a) //1
 console.log(b) //2
 console.log(c) //3
 //如果解构不成功,变量的值为undefined
  • 对象解构
 let person = { name: 'zhangsan', age: 20 }; 
 let { name, age } = person;
 console.log(name); // 'zhangsan' 
 console.log(age);  // 20

 let {name: myName, age: myAge} = person;
 console.log(myName); // 'zhangsan' 
 console.log(myAge);  // 20

5. 箭头函数

作用:为了简化 匿名函数 的编写
语法() => {}
() 代表函数
=> 必须要的符号,指向哪一个代码块
{} 函数体
const fn = () => {} 把一个函数赋值给 fn

  • 如果函数体中只有一行代码且需要返回数据,可以省略大括号
 let sum = (a, b) => { 
     return a + b 
 }
 let sum = (a, b) => a + b
  • 如果只有一个参数,可以省略参数外的小括号
let sum = (item) => {}
let sum = item => {}
  • 如果函数没有参数或多个参数,必须写小括号
let sum = () => {}
let sum = (a, b) => {}
  • this 的指向
    箭头函数不绑定 this关键字
    箭头函数内部 this 指向当前定义的位置
let div = document.querySelector('div')
// div.onclick = function() {
// 	console.log(this)
// }

div.onclick = () => {
	console.log(this) // window,  this 指向当前函数定义的位置
}

6. 剩余参数

作用:当实参数量大于形参数量时,剩余的参数可以用 ...args 方式接受剩余的参数

 let sum = (...args) => {
   let total = 0
   args.forEach(item => total += item)
   return total
 }

 sum(1, 2, 3, 4, 5)

剩余参数和解构配合使用

 let students = ['wangwu', 'zhangsan', 'lisi'];
 let [s1, ...s2] = students; 
 console.log(s1);  // 'wangwu' 
 console.log(s2);  // ['zhangsan', 'lisi']


二、ES6 的内置对象扩展


1. Array 的扩展方法


1.1 扩展运算符(重点)

作用:可以将数组或者对象转为用逗号分隔参数序列

 let ary = [1, 2, 3];
 ...ary  // 1, 2, 3
 console.log(...ary);  // 1 2 3,相当于下面的代码

合并数组

 // 方法一 
 let ary1 = [1, 2, 3];
 let ary2 = [3, 4, 5];
 let ary3 = [...ary1, ...ary2];
 // 方法二 
 ary1.push(...ary2);
 // 方法三
 Array.prototype.push.apply(arr1, arr2)
 console.log(arr1);

将伪数组转换为真数组

 let divs = document.getElementsByTagName('div')
 let arr = [...divs]
 // 转为真数组就可以调用数组对象下面的方法

1.2 Array.from() 方法

作用:将伪数组转为真数组,对象就是一个伪数组

 //定义一个集合
 let a = {
     '0': 'a',
     '1': 'b',
     '2': 'c',
     length: 3
 }; 
 //转成数组
 let b = Array.from(a); // ['a', 'b', 'c']

 // 还可以接受第二个参数,作用类似于数组的map方法
 // 用来对每个元素进行处理,将处理后的值放入返回的数组
 let arrayLike = { 
     "0": 1,
     "1": 2,
     "length": 2
 }
 let newAry = Array.from(arrayLike, item => item   *2)//[2,4]
 // 注意:如果是对象,那么属性需要写对应的索引

1.3 Array 的实例方法(重点)


1.3.1 实例方法:find()

作用:返回第一个匹配条件的元素(查找元素),如果没找到返回 undefined

 // arr.indexOf(1) 查找1对应的索引
 // 有就返回索引, 没有就返回 -1
 let arr = [{
     name: 'zs',
     age: 18
 }, {
     name: 'ww',
     age: 20
 }]
 let obj = arr.find(item => item.name === 'ww')
 console.log(obj)

1.3.2 实例方法:findIndex()

作用:返回第一个匹配元素的索引,如果没找到返回 -1

 let ary = [1, 5, 10, 15];
 let index = ary.findIndex(item => item > 9); 
 console.log(index); // 2

1.3.3 实例方法:includes()

作用:判断数组中是否包含该元素,返回 boolean 类型的值

 // arr.indexOf(1) 查找1对应的索引
 // 有就返回索引, 没有就返回 -1
 [1, 2, 3].includes(2) // true 
 [1, 2, 3].includes(4) // false
 let arr = [1, 2, 3, 4, 5]
 arr.includes(1) // 有1就是true  没有就是false

2. String 的扩展方法

2.1 模板字符串(重点)

作用:用于拼接字符串

 let name = '张三'; 
 let sayHello = `hello,my name is ${name}`;
 // hello, my name is zhangsan

 // 模板字符串换行
 let result = { 
     name: 'zhangsan', 
     age: 20,
     sex: '男' 
 } 
 let html = ` <div>
    <span>${result.name}</span>
    <span>${result.age}</span>
    <span>${result.sex}</span>
 </div> `;

 // 模板字符串: 调用函数得到结果
 function getData() {
     return '结果'
 }
 let str = `我现在想拿到结果,具体内容是:${getData()}`

2.2 实例方法:

  • startsWith() 表示参数字符串是否在原字符串的头部,返回布尔值
  • endsWith() 表示参数字符串是否在原字符串的尾部,返回布尔值
 let str = 'Hello world!';
 str.startsWith('Hello') // true 
 str.endsWith('!')       // true

2.3 实例方法:repeat()

作用:将字符串重复n次,返回一个新字符串,参数:重复的次数

 let str = 'abc'
 str.repeat(3) // abcabcabc

3. Set 数据结构

作用:过滤数组重复的值
Set 它类似于数组,但是成员的值都是唯一的,没有重复的值,数组通过索引获取元素,而 Set 不能
Set本身是一个构造函数,用来生成 Set 数据结构

const s = new Set();
// Set函数可以接受一个数组作为参数,用来初始化
const set = new Set([1, 2, 3, 4, 4]);//{1, 2, 3, 4}

实例方法

  • add() 添加元素,返回 Set 结构本身
  • delete() 删除元素,返回一个布尔值,表示删除是否成功
  • has() 判断元素是否存在,返回一个布尔值
  • clear() 清空Set,没有返回值
  • forEach() 遍历元素,和Array的forEach一样
  • size 属性, 获取Set中元素的个数

遍历

Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值

 // s.forEach(value => console.log(value))
 const s = new Set([1, 2, 3]);
 s.forEach(value => {
     console.log(value);
 });

以上是关于Es6新增语法梳理的主要内容,如果未能解决你的问题,请参考以下文章

es6新增语法详解

ES6 数组新增语法

ES6新增语法——面向对象

ES6新增语法详述 𳞰

ES6新增语法详述 𠀶

ES6新增语法 + 内置对象扩展 + 箭头函数